簡體   English   中英

處理非常大(超過 30GB)的文本文件並顯示進度的最佳方法是什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM