|
|
1
7
我建议你看看 presentation by David Beazley 在Python中使用生成器。这项技术允许您处理大量数据,并进行复杂的处理,快速且不会占用内存。在我看来,诀窍不是尽可能有效地在内存中保存大量数据;诀窍是避免同时将大量数据加载到内存中。 |
|
|
2
3
在您开始对垃圾收集器大惊小怪之前,通过使用内存映射文件对象,您可能可以避免将整个文件加载到内存中的100mb开销。见 mmap |
|
|
3
3
不要一次读取整个100兆欧的文件。使用流一次处理一点点。查看这篇关于处理大型csv和xml文件的博客文章。 http://lethain.com/entry/2009/jan/22/handling-very-large-csv-and-xml-files-in-python/ 下面是本文中的代码示例。
|
|
|
4
2
因此,根据您的评论,我假设您的文件如下所示:
通过反复应用一些组合函数,你们都可以将其简化为一个值。作为解决方案,一次只能读取一个值:
这样,内存消耗保持不变,除非
我希望我正确地解释了你的问题。 |
|
|
5
1
首先,不要碰垃圾收集器。这不是问题,也不是解决办法。 冷凝使用 删除处理过程中不再需要的结构。此外,您可以考虑使用 元帅 在处理下一个100mb的输入文件时,将一些已处理的数据转储到磁盘。 对于文件读取,基本上有两种选择:unix样式的文件作为流,或内存映射文件。对于基于流的文件,默认的python文件对象已经被缓冲,因此最简单的代码可能也是最有效的: with open("filename", "r") as f:
for line in f:
# do something with a line of the files
或者,您可以使用f.read([size])来读取文件块。但是,通常这样做是为了提高CPU性能,方法是对脚本的处理部分进行多线程处理,以便可以同时读取和处理。但这对内存使用没有帮助;事实上,它使用了更多的内存。 另一个选项是mmap,如下所示: with open("filename", "r+") as f:
map = mmap.mmap(f.fileno(), 0)
line = map.readline()
while line != '':
# process a line
line = map.readline()
这有时优于流,但也不会提高内存使用率。 |