[英]How can I efficiently open 30gb of file and process pieces of it without slowing down?
[英]What is the optimal way to process a very large (over 30GB) text file and also show progress
[新手問題]
你好,
我正在處理一個超過 30GB 的巨大文本文件。
我必須對每一行進行一些處理,然后將其寫入 JSON 格式的數據庫。 當我讀取文件並使用“for”循環時,我的計算機在處理了大約 10% 的數據后崩潰並顯示藍屏。
我目前正在使用這個:
f = open(file_path,'r')
for one_line in f.readlines():
do_some_processing(one_line)
f.close()
另外,我怎樣才能顯示到目前為止已經處理了多少數據的總體進展?
非常感謝大家。
文件句柄是可迭代的,您可能應該使用上下文管理器。 嘗試這個:
with open(file_path, 'r') as fh:
for line in fh:
process(line)
這可能就足夠了。
我使用這樣的 function 來解決類似的問題。 你可以用它來包裝任何可迭代的東西。
改變這個
for one_line in f.readlines():
您只需要將代碼更改為
# don't use readlines, it creates a big list of all data in memory rather than
# iterating one line at a time.
for one_line in in progress_meter(f, 10000):
您可能希望根據要浪費打印狀態消息的時間來選擇更小或更大的值。
def progress_meter(iterable, chunksize):
""" Prints progress through iterable at chunksize intervals."""
scan_start = time.time()
since_last = time.time()
for idx, val in enumerate(iterable):
if idx % chunksize == 0 and idx > 0:
print idx
print 'avg rate', idx / (time.time() - scan_start)
print 'inst rate', chunksize / (time.time() - since_last)
since_last = time.time()
print
yield val
使用 readline 強制查找文件中每一行的結尾。 如果某些行很長,可能會導致您的解釋器崩潰(沒有足夠的 memory 來緩沖整行)。
為了顯示進度,您可以檢查文件大小,例如使用:
import os
f = open(file_path, 'r')
fsize = os.fstat(f).st_size
然后,您的任務進度可以是處理的字節數除以文件大小乘以 100 得到一個百分比。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.