处理非常大(超过30GB)的文本文件并显示进度的最佳方法是什么

时间:2011-05-26 22:17:08

标签: python data-processing

[新手问题]

您好,

我正在研究一个超过30GB的巨大文本文件。

我必须对每一行进行一些处理,然后以JSON格式将其写入数据库。当我读取文件并使用“for”循环时,我的计算机崩溃并在大约10%的处理数据后显示蓝屏。

我目前正在使用这个:

f = open(file_path,'r')
for one_line in f.readlines():
    do_some_processing(one_line)
f.close()

此外,我如何才能显示到目前为止已经收集了多少数据的整体进度?

非常感谢你。

3 个答案:

答案 0 :(得分:4)

文件句柄是可迭代的,您应该使用上下文管理器。试试这个:

with open(file_path, 'r') as fh:
  for line in fh:
    process(line)

这可能已经足够了。

答案 1 :(得分:1)

我使用这样的函数来解决类似的问题。你可以用它包装任何迭代。

更改此

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

答案 2 :(得分:0)

使用readline强制查找文件中每行的结尾。如果某些行非常长,则可能导致解释器崩溃(没有足够的内存来缓冲整行)。

为了显示进度,您可以使用以下方法检查文件大小:

import os
f = open(file_path, 'r')
fsize = os.fstat(f).st_size

然后,您的任务进度可以是处理的字节数除以文件大小乘以100以获得百分比。