Python-无限循环,同时批量读取非常大的文本文件



好的,我有一个大的(8GB+(txt文件,其中包含最有可能来自大型机b/c的遗留数据——所有的固定字段都必须逐行解析&一个字符接一个字符。逐行读取文件在小样本上运行良好,但不会扩展到几百MB以上。

从本质上讲,我想分批读取txt文件,比如说每批500万行,然后逐行处理每个批。

这是我用Python写的,但由于某种原因,当在一个较小的文件上测试时,下面的代码最终会进入一个无限循环。我有点困惑,中断实际上从未被触发,快照一直被覆盖。知道怎么解决吗?

# Python 3.x 
def convert_txt_to_csv(path_to_txt, path_to_save_csv, column_names):
df = pd.DataFrame(columns=column_names)
chunksize = 5000 # 5000000 - 5 million batches for the big file
print("Add rows...")
with open(path_to_txt, 'r', encoding="ISO-8859-1") as file:
lines = True
cnt = 0
mil = 1
while lines:
lines = file.readlines(chunksize) # This guy should become False if there no more lines...
if not lines:
break # Double safety, if they're no more lines, escape the loop... 
for line in lines:
process_line(line.replace('n', ''), df, cnt)
cnt += 1
# save snapshot after each batch 
df.to_csv(path_to_snapshot_csv)
print("Saved Snapshot: ", mil)
mil +=1

print("Process")
df = process(df)
print("Safe")
df.to_csv(path_to_save_csv)
print("Nr. of data: ", len(df.index))

解决方案:

上面的代码实际上是有效的,但实际的错误是快照行的意图不正确,并且在每一行之后而不是在每一批之后被调用,因此造成了一种印象,即循环将永远被重新创建快照卡住。在此期间,我应用了一些优化:

1( 对于大小合理的文件w.o批处理:

对于文件中的行:#不要使用readline。。。

process_line(line) 

2( 用于加速读取文件:

创建一个ramdisk并在那里复制输入文件。

3( 对于批处理,readline中的chunk参数是某种奇怪的bytsize,因此,例如,1500000转换为一行读取2995行。

用ramdisk&批处理,现在处理实际上相当快。感谢所有宝贵的投入&问题。

相关内容

最新更新