【问题标题】:What is the optimal way to process a very large (over 30GB) text file and also show progress处理非常大(超过 30GB)的文本文件并显示进度的最佳方法是什么
【发布时间】:2011-05-26 22:17:08
【问题描述】:

[新手问题]

嗨,

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

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

我目前正在使用这个:

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

此外,我如何显示到目前为止已处理的数据的总体进度?

非常感谢大家。

【问题讨论】:

  • 您是否尝试过摆脱已经处理的内容?
  • f.tell() 显示你在哪里,正如其他人所建议的那样;一次读取一行文件,而不是像上面那样一次读取所有文件

标签: python data-processing


【解决方案1】:

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

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

这可能就足够了。

【讨论】:

  • @Dhaivat - 我认为你不明白这段代码在做什么,它确实非常有效。比像read()readlines() 那样一次性读取整个文件内容要好得多。
  • @Dhaivat - 出于好奇,您认为哪一部分效率低下?它具有许多优点(整个文件不在内存中、错误处理、文件句柄自动关闭),而我看不到任何真正的缺点。
  • 糟糕,这很尴尬。我评论了错误的答案。
  • @Dhaivat - 没问题。很高兴你澄清了。 :)
【解决方案2】:

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

改变这个

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() 是遍历行而不是行中的字符,所以我很确定这是一个错字。
【解决方案3】:

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

为了显示进度,您可以检查文件大小,例如使用:

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

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

【讨论】:

    猜你喜欢
    • 2019-01-30
    • 2014-02-11
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2020-07-28
    相关资源
    最近更新 更多