我有一个大的tsv文件(~2.5Gb)。我遍历每一行,其中该行有6个选项卡。我获取每行的第一个选项卡,并将该行附加到基于第一个选项卡的csv文件中。目标是以基于主tsv行的csv文件排序的文件结束。你知道吗
这适用于小规模的文件,但当我在大文件上运行时,IPython控制台永远不会结束。我要保存到的文件看起来好像正在被填充,但当我打开它时,什么也不显示。你知道吗
import csv
file_path = ".../master.tsv"
with open(file_path, 'r') as masterfile:
for line in masterfile:
line_split = line.split("|")
cik = line_split[0].zfill(10)
save_path = ".../data-sorted/"
save_path += cik + ".csv"
with open(save_path, 'a') as savefile:
wr = csv.writer(savefile, quoting=csv.QUOTE_ALL)
wr.writerow(line_split)
假设你有足够的内存,你最好在内存中对文件进行排序,比如把它放到字典里,然后一次把它写到磁盘上。如果I/O确实是您的瓶颈,那么您只需打开一次输出文件就可以获得很多好处。你知道吗
您可能没有足够的内存来加载整个文件。在这种情况下,您可以将其转储为块,如果块足够大,最终仍会为您节省大量的I/O。下面的分块方法非常快速和肮脏。你知道吗
你的代码是非常低效的,因为它打开并附加了它所处理的输入文件的每一行的数据,如果输入文件那么大的话,这将是非常多的次数(因为这样做所需要的操作系统调用相对较慢)。你知道吗
另外,我注意到你的代码中至少有一个bug,那就是:
它只会让
save_path
越来越长…不是需要的。你知道吗不管怎样,这里有一个工作速度应该更快的方法,尽管处理这么大的文件可能还需要相当长的时间。它通过缓存中间结果来加快进程。它只打开不同的输出csv文件,并尽可能不频繁地创建它们相应的
csv.writer
对象,第一次需要它们,并且只有在它们因为缓存达到其最大长度而关闭时才需要它们。你知道吗请注意,缓存可能会消耗大量内存,这取决于有多少个唯一的csv输出文件以及可以同时打开多少个文件,但使用大量内存是它运行速度更快的原因。您需要四处玩,手动调整
MAX_OPEN
值,以找到速度和内存使用之间的最佳折衷,同时保持在操作系统允许一次打开多少文件的限制之下。你知道吗还要注意的是,通过更智能地选择要关闭的现有文件条目,而不是随机选择一个(打开的)条目,可以使它的工作更加高效。然而,这样做是否真的有用取决于输入文件中的数据是否有任何有利的分组或其他顺序。你知道吗
相关问题 更多 >
编程相关推荐