3

[新手问题]

你好,

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

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

我目前正在使用这个:

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

另外,我怎样才能显示到目前为止已经处理了多少数据的总体进展?

非常感谢大家。

4

3 回答 3

4

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

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

这可能就足够了。

于 2011-05-26T22:22:36.233 回答
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
于 2011-05-26T22:22:09.793 回答
0

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

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

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

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

于 2011-05-26T22:25:00.127 回答