[新手问题]
您好,
我正在研究一个超过30GB的巨大文本文件。
我必须对每一行进行一些处理,然后以JSON格式将其写入数据库。当我读取文件并使用“for”循环时,我的计算机崩溃并在大约10%的处理数据后显示蓝屏。
我目前正在使用这个:
f = open(file_path,'r')
for one_line in f.readlines():
do_some_processing(one_line)
f.close()
此外,我如何才能显示到目前为止已经收集了多少数据的整体进度?
非常感谢你。
答案 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以获得百分比。