我必须将一些任意文本添加到现有的但非常大的(2-10 GB范围)文本文件中。由于文件如此大,我试图避免将整个文件读入内存中。但是,对于逐行迭代,我是不是太保守了?与目前的方法相比,转到读行方法(sign线索)会给我带来很大的性能优势吗?
最后的删除和移动并不理想,但据我所知,没有办法对线性数据进行这种操作。但我不太精通Python --也许Python有什么独特之处,我可以利用它来做得更好吗?
import os
import shutil
def prependToFile(f, text):
f_temp = generateTempFileName(f)
inFile = open(f, 'r')
outFile = open(f_temp, 'w')
outFile.write('# START\n')
outFile.write('%s\n' % str(text))
outFile.write('# END\n\n')
for line in inFile:
outFile.write(line)
inFile.close()
outFile.close()
os.remove(f)
shutil.move(f_temp, f)
发布于 2011-02-11 02:45:43
您想要做的是大范围读取文件(从64k到几MB),并将这些块写出来。换句话说,不用单独的行,而是使用巨大的块。这样你就可以做到最少的I/O,希望你的进程是I/O绑定,而不是CPU绑定。
发布于 2011-04-03 18:53:38
如果这是在Windows上,则可以插入文件的中间。(有人告诉我,我不是Windows开发人员)。
如果这是在POSIX (Linux或Unix)系统上,您应该像其他人所说的那样使用"cat“。猫是邪恶的效率,利用书中的每一个技巧,以获得最佳的表现。复制缓冲区等)
但是,如果您必须在python中这样做,则可以通过使用shutil.copyfileobj() (它需要2个文件句柄)和tempfile.TemporaryFile (创建一个在关闭时自动删除的文件)来改进您提供的代码:
import os
import shutil
import tempfile
def prependToFile(f, text):
outFile = tempfile.NamedTemporaryFile(dir='.', delete=False)
outFile.write('# START\n')
outFile.write('%s\n' % str(text))
outFile.write('# END\n\n')
shutil.copyfileobj(file(f, 'r'), outFile)
os.remove(f)
shutil.move(outFile.name, f)
outFile.close()
我认为不需要os.remove( f ),因为shutil.move()将删除f。此外,"delete=False“可能不需要,但可能是安全的离开它。
发布于 2011-02-11 02:42:22
您可以使用更适合作业os.system("cat file1 file2 > file3")
的工具。
https://stackoverflow.com/questions/4965111
复制相似问题