我有一个巨大的文本文件,可以是2到20 GB。内容是来自给定查询列表的结果列表。我试图将它发送到我的'parse'脚本中,因为我需要将每组结果读入内存,以便我可以对它们进行索引操作。出于某种原因,当我将整个文件加载到内存中时,我获得的解析结果比使用以下代码将输入文件切换为块时更多:
with open(infile, 'r') as rfile:
block = []
thresh = 100000
for i, line in enumerate(rfile):
if i >= thresh:
if "Iteration: 1" in line: # This marks the end of one set of results, and the beginning of the next, so we don't truncate any results
read_block(block)
thresh += 100000
del block[:]
block.append(line)
知道我为什么要丢失这段代码的数据?或者是一切都在这里犹豫不决,我的错误是这个函数与read_block()方法交互奇怪的结果......
答案 0 :(得分:0)
这个嵌套的if
可能会导致您出现问题(可能需要read_block
的帮助):
if i >= thresh:
if "Iteration: 1" in line:
read_block(block)
thresh += 100000
del block[:]
它相当于复合if
条件,因为如果两个条件都为真,它只运行最里面的块:
if i >= thresh and "Iteration: 1" in line:
read_block(block)
thresh += 100000
del block[:]
因此,每当此循环遇到一小组结果 - 少于100,000行时,外部for
循环继续在结果集中啜饮,直到它们的组合长度超过阈值。最后调用read_block
时,将为其提供包含两个或更多集的block
行。 read_block
可以应对吗?
此外,如果您有一个特别长的结果集---或者任何组合的组合不能精确地累计超过100,000行 - 则在循环到达当前集的末尾之前完全忽略该阈值。如果你的其他函数假设block
永远不会超过100,000行,那么他们会得到一个粗鲁的惊喜。
最后,thresh
总是增加100,000,而不是实际读取多行。由于这不会发生在i >= thresh
(可能多大于)之后,thresh
将落后于现实。如果该100,000行阈值确实很重要,那么您应该将其设置为100,000行从现在开始:
thresh = i + 100000
重申我上面评论的内容,为什么不一次只提供一个结果集read_block
(或read_one_results_set
或其他什么),而不用担心计算行?