逐行读取文件还是存储在内存中?

时间:2014-07-07 08:38:44

标签: python file ram

这不是一个"我的代码被打破"问题和更多的问题"我应该这样做吗?"问题

我有一个脚本,使用类似这样的东西逐行迭代:reader = csv.DictReader(open('file.txt', 'rb'), delimiter= '\t')并获取年龄和日期等内容,而不会将整个内容提交到内存中。

目前,脚本uses about 5% of my RAM(8GB)。

一般来说,将文件放入内存而不是打开它并循环遍历其内容是否更为可接受 - 特别是如果文件大(超过700MB)?

我的脚本仅供个人使用,但我宁愿学习Python的惯例并做一些被认为可接受的事情。例如,我知道如果我在JavaScript中做类似的事情,我会尝试尽可能地节省内存,以防止浏览器崩溃或无响应。

Python中的方法(内存与循环)是否优先于另一种方法?

编辑:我知道这可能有点广泛。我对最好的(Pythonic)练习更感兴趣。

似乎有很多帖子要求如何来做,但不是很多要求为什么如果

2 个答案:

答案 0 :(得分:1)

AFAIK,你的方法是做到这一点的pythonic方法。

您应该知道open('file.txt')没有将整个文件放入内存的事实。它返回一个按需读取文件的迭代器。您的DictReader也是如此。

只要尝试处理大文件,就不会发现内存消耗有任何增加。

答案 1 :(得分:1)

大多数情况下,在阅读文件时处理文件会更好。操作系统期望这样的行为,因此它会提前读取一点以补偿磁盘系统的延迟。完整地加载文件通常会保留仅用于您的过程的内存,如果您只扫描一次,那将是浪费。您可以对其进行mmap,这样可以让系统直接使用磁盘缓冲区,但这会丢失您接下来要读取的位置的提示。读取太小的块会导致系统调用开销占主导地位,因此如果可能的话,您将要读取相当大的块,但对于大多数程序,读取行时的默认缓冲就足够了。