加速随机数据的生成

4

我写了一个非常简单的脚本来创建一些机器学习所需的随机数据。

from random import randint

f = open('2014-07-17-1M_testdata_1Mx500.cvs', 'w', 50000000) #50MB write buffer
for i in range(1000000): #num rows
    for i2 in range(500): #entries per row
        f.write(str(randint(0,1000000))) #Return a random integer N such that a <= N <= b.
        if(i2 != 499): #entries per row - 1
            f.write(",")
    f.write("\n")
    if(i != 0 and i % 100000 == 0):
        print(str(i) + " lines written")
f.close

然而,我发现一个CPU核心使用了100%的负载,并且数据创建所需的时间比磁盘速度允许的时间更长。对于创建大型数据集(100GB以上),有没有简单的方法来加快速度?也许可以尝试使用一些更快的随机库。


1
打印五亿条记录似乎是一个由单个核心完成的缓慢任务,特别是在Python中。我不确定“随机”是否是瓶颈,但磁盘I/O可能是。 - BlackVegetable
我使用了 iostat 监控磁盘 I/O,大部分时间它都是空闲的。 - helm
好的,我没有查看写缓冲区的实现。它只是每隔几秒钟写入那50M的数据,但我猜测填充缓冲区的方式可能是低效的。 - helm
一定要告诉我们你的发现,我很想知道你最终的解决方案! - BlackVegetable
你为什么要在数据集达到100GB时使用CSV文件?为什么不使用二进制格式? - Warren Weckesser
显示剩余2条评论
1个回答

3

纯Python很难达到高效,但幸运的是有一些有效的Python库可以帮助加快速度。numpy就是其中一个不错的选择:

import numpy
import numpy.random

f = open('2014-07-17-1M_testdata_1Mx500.csv', 'w', 50000000)

for i in range(1000):
    m = numpy.random.random_integers(0, 1000000, (1000, 500))
    numpy.savetxt(f, m, delimiter=',')

f.close()

在我的 MacBook Pro 上运行,代码明显受写入磁盘的限制而非 CPU,因此这似乎可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接