有更好的实现吗
file = open("./myFile.txt","w+")
for doc in allDocuments: #around 35 million documents
file.write(str(doc.number)+"rn")
f.close()
目前,这种实现每个文件需要20秒
I/O并不是真正的问题,也不能对此做任何有用的事情:文件对象和操作系统都将进行某种形式的缓冲。可以做的事情是您进行的方法调用的数量。
with open("./myFile.txt", "w", newline='rn') as f:
f.writelines(f'{doc.number}n' for doc in allDocuments)
writelines
方法采用可迭代的字符串来写入文件。(文档中说的是"list",但它似乎指的是列表,而不是list
s;生成器表达式似乎也能工作。(生成器表达式根据writelines
的需要生成每一行。
这里有一个测试:
import random
def allDocuments():
for i in range(35_000_000):
yield random.randint(0, 100)
with open("tmp.txt", "w", newline='rn') as f:
f.writelines(f'{doc}n' for doc in allDocuments())
它在75秒内完成(其中大部分是由于对random.randint
的重复调用(,使用了不到6MB的内存。(将对random.randint
的调用替换为常数值,使运行时间降至30秒以下。(
您可以缓冲输出并写入块:
with open("./myFile.txt", "w") as output:
lines = []
for doc in allDocuments:
lines.append(f"{doc.number}rn")
if len(lines) > 1000:
output.writelines(lines)
lines = []
output.writelines(lines)