除了使用多个临时文件之外,是否有更好的方法来临时存储文本文件的大量输出数据(放在列和行中)?



我需要在文本文件中存储大量以逗号分隔的数字数据。这个txt文件将是将进行计算的脚本的输出。

我的问题在于方法 - 它似乎太混乱了,涉及很多临时文件(我有五个),我确保其中包含适合每个数据点的确切行数,并且只有在完成所有计算后才会合并到一个文件中。我的代码非常混乱,我什至不得不使用一次 deque 来从临时文件中删除一些多余的行。

我在整个脚本中多次使用此模板

o = open('%s_outcombined.xvg'%outfile, 'a+')
fh = open('%s_outfinal.xvg'%outfile, 'rb')
fh2 = open('%s_outfor_diff_calcs.xvg'%outfile, 'rb')
for line in fh.readlines():
o.write(line.strip('rn') + fh2.readline().strip('rn') + 'n')
fh.close()
fh2.close()
o.close()

以创建和组合所述临时文件。

预期成果:

  • 具有逗号分隔数值的单个文本文件 - 这将来自对 12 GB 输入文件进行的计算。

  • 一种不涉及使用多个临时文件的方法(或者如果有办法使它们隐藏,我真的很想知道)

  • 一种不耗时的数据存储方法

实际结果:

  • 多个临时文件,代码混乱

我想知道依靠列表来存储大量数据(要计算的输入文件为 12+ GB)是否更耗时,或者我是否应该坚持我目前的方法,或者如果您有更好的想法,我将不胜感激。

您可以使用批处理来完成这项工作,因为 12 GB 大部分时间都很大才能存储在内存中。 就像处理前 200 行同时将它们保存在内存中并将它们保存到输出文件中,然后继续接下来的 200 行,直到到达末尾。

伪代码:

outputFile = new File("output")
inputFile = new File("input")
row = inputFile.readLine() # first line
while row != null:
if outputFile.readLine() == null: # so we don't recalculate already calculated data
columns = row.split(",")
columns = doFirstCalculation(columns)
columns = doSecondCalculation(columns)
outputFile.appendLine(columns.join(","))
else:
print("skipped line since already calculated")
row = inputFile.readLine() # next line

只需减少读取和写入即可提高速度。RAM 比磁盘快。