这不是一个"我的代码被打破"问题和更多的问题"我应该这样做吗?"问题
我有一个脚本,使用类似这样的东西逐行迭代:reader = csv.DictReader(open('file.txt', 'rb'), delimiter= '\t')
并获取年龄和日期等内容,而不会将整个内容提交到内存中。
目前,脚本uses about 5% of my RAM(8GB)。
一般来说,将文件放入内存而不是打开它并循环遍历其内容是否更为可接受 - 特别是如果文件大(超过700MB)?
我的脚本仅供个人使用,但我宁愿学习Python的惯例并做一些被认为可接受的事情。例如,我知道如果我在JavaScript中做类似的事情,我会尝试尽可能地节省内存,以防止浏览器崩溃或无响应。
Python中的方法(内存与循环)是否优先于另一种方法?
编辑:我知道这可能有点广泛。我对最好的(Pythonic)练习更感兴趣。
似乎有很多帖子要求如何来做,但不是很多要求为什么或如果。
答案 0 :(得分:1)
AFAIK,你的方法是做到这一点的pythonic方法。
您应该知道open('file.txt')
没有将整个文件放入内存的事实。它返回一个按需读取文件的迭代器。您的DictReader
也是如此。
只要尝试处理大文件,就不会发现内存消耗有任何增加。
答案 1 :(得分:1)
大多数情况下,在阅读文件时处理文件会更好。操作系统期望这样的行为,因此它会提前读取一点以补偿磁盘系统的延迟。完整地加载文件通常会保留仅用于您的过程的内存,如果您只扫描一次,那将是浪费。您可以对其进行mmap,这样可以让系统直接使用磁盘缓冲区,但这会丢失您接下来要读取的位置的提示。读取太小的块会导致系统调用开销占主导地位,因此如果可能的话,您将要读取相当大的块,但对于大多数程序,读取行时的默认缓冲就足够了。