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

1 投票
2 回答
2466 浏览
提问于 2025-04-18 12:19

这个问题不是“我的代码坏了”那种,而是“我应该这样做吗?”的疑问。

我有一个脚本,它逐行读取文件,像这样:reader = csv.DictReader(open('file.txt', 'rb'), delimiter= '\t'),然后获取一些信息,比如年龄和日期,而且不会把整个文件都放到内存里。

目前这个脚本大约使用了我内存的5%(我有8GB的内存)。

一般来说,把一个文件放到内存里,而不是打开它并逐行处理,特别是当文件很大的时候(超过700MB),这种做法是否更被接受呢?

我的脚本是个人使用的,但我更想了解Python的惯例,做一些被认为是合适的事情。例如,我知道如果我在JavaScript中做类似的事情,我会尽量节省内存,以防止浏览器崩溃或变得无响应。

在Python中,有没有一种方法(内存使用与循环处理)更受欢迎呢?

补充:我知道这个问题可能有点宽泛。我更好奇的是最佳的(Pythonic)实践是什么。

似乎有很多帖子在问怎么做,但很少有人问为什么或者是否

2 个回答

1

大多数情况下,边读边处理文件会更好。操作系统也希望这样做,所以它会提前读取一些数据,以弥补磁盘系统的延迟。如果你一次性把整个文件加载到内存中,通常会占用只属于你这个程序的内存,这样做很浪费,特别是当你只是简单浏览文件的时候。你可以使用mmap,这样可以让系统直接使用磁盘缓冲区,但这样就失去了你接下来要读取位置的提示。读取太小的数据块会导致系统调用的开销变得很大,所以如果可以的话,最好读取较大的数据块。不过对于大多数程序来说,默认的逐行读取缓冲就已经足够了。

1

据我所知,你的方法是用Python的标准方式来做这件事。

你需要知道的是,open('file.txt') 并不会把整个文件都放到内存里。它返回的是一个迭代器,意思是它会根据需要逐行读取文件。你的 DictReader 也是这样。

你可以试着处理一个大文件,你会发现内存的使用量并没有增加。

撰写回答