[英]Efficiently prepending text to a very large text file in Python
我必須在現有但非常大(2-10 GB范圍)的文本文件之前添加一些任意文本。 由於文件太大,我試圖避免將整個文件讀入內存。 但是我對逐行迭代是否過於保守? 與目前的方法相比,采用readlines( sizehint )方法是否會給我帶來很多性能優勢?
最后的刪除和移動並不理想,但是據我所知,沒有辦法對線性數據進行適當的處理。 但是我並不精通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)
如果在Windows NTFS上,則可以插入文件的中間。 (或者,有人告訴我,我不是Windows開發人員)。
如果這是在POSIX(Linux或Unix)系統上,則應使用“ cat”作為其他人所說的。 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”,但可以放心地刪除它。
您可以使用更適合作業os.system("cat file1 file2 > file3")
工具os.system("cat file1 file2 > file3")
您要做的是讀取大文件(從64k到幾MB)的文件,然后將其寫出。 換句話說,請使用巨大的塊而不是單獨的行。 這樣,您就可以進行最少的I / O,並希望您的進程是I / O綁定的,而不是CPU綁定的。
老實說,如果您擔心執行時間,我建議您只用C編寫。 從Python進行系統調用可能會非常慢,並且由於必須逐行或原始塊讀取方法,因此必須執行很多操作,這確實會拖累事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.