我想在csv文件中写一些随机样本数据,直到它大到1GB.以下代码正在运行:
import numpy as np
import uuid
import csv
import os
outfile = 'data.csv'
outsize = 1024 # MB
with open(outfile, 'ab') as csvfile:
wtr = csv.writer(csvfile)
while (os.path.getsize(outfile)//1024**2) < outsize:
wtr.writerow(['%s,%.6f,%.6f,%i' % (uuid.uuid4(), np.random.random()*50, np.random.random()*50, np.random.randint(1000))])
Run Code Online (Sandbox Code Playgroud)
如何加快速度?
删除所有不必要的东西,因此它应该更快更容易理解:
import random
import uuid
outfile = 'data.csv'
outsize = 1024 * 1024 * 1024 # 1GB
with open(outfile, 'ab') as csvfile:
size = 0
while size < outsize:
txt = '%s,%.6f,%.6f,%i\n' % (uuid.uuid4(), random.random()*50, random.random()*50, random.randrange(1000))
size += len(txt)
csvfile.write(txt)
Run Code Online (Sandbox Code Playgroud)
问题似乎主要是IO绑定.您可以通过以更大的块写入文件而不是一次写入一行来改善I/O:
import numpy as np
import uuid
import os
outfile = 'data-alt.csv'
outsize = 10 # MB
chunksize = 1000
with open(outfile, 'ab') as csvfile:
while (os.path.getsize(outfile)//1024**2) < outsize:
data = [[uuid.uuid4() for i in range(chunksize)],
np.random.random(chunksize)*50,
np.random.random(chunksize)*50,
np.random.randint(1000, size=(chunksize,))]
csvfile.writelines(['%s,%.6f,%.6f,%i\n' % row for row in zip(*data)])
Run Code Online (Sandbox Code Playgroud)
您可以尝试使用chunksize(每个块写入的行数)来查看在您的计算机上最有效的方法.
这是一个基准测试,将上面的代码与原始代码进行比较,outsize设置为10 MB:
% time original.py
real 0m5.379s
user 0m4.839s
sys 0m0.538s
% time write_in_chunks.py
real 0m4.205s
user 0m3.850s
sys 0m0.351s
Run Code Online (Sandbox Code Playgroud)
所以这比原始代码快25%左右.
PS.我尝试将呼叫替换为os.path.getsize估计所需的总线路数.不幸的是,它没有提高速度.由于表示最终int所需的字节数不同,因此估计也不准确 - 也就是说,它不能完美地复制原始代码的行为.所以我离开了os.path.getsize原地.
| 归档时间: |
|
| 查看次数: |
15852 次 |
| 最近记录: |