python - 分块处理大文件

标签 python

我有一个大文件,每行有两个数字,并按第二列排序。我制作了一本以第一列为关键字的列表字典。

我的代码看起来像

from collections import defaultdict
d = defaultdict(list)
for line in fin.readline():
    vals = line.split()
    d[vals[0]].append(vals[1])
process(d)

然而,输入文件 large 太大,因此 d 将无法放入内存。

为了解决这个问题,我原则上可以一次读取文件的 block ,但我需要在 block 之间进行重叠,以便 process(d) 不会遗漏任何内容。

在伪代码中,我可以执行以下操作。

  1. 阅读 100 行创建字典 d
  2. 处理字典d
  3. d 中删除所有不在目前看到的最大值 10 以内的内容。
  4. 重复,但要确保 d 中的数据在任何时候都不超过 100 行。

有没有在 python 中执行此操作的好方法?

更新问题的更多细节。在读取第二个成对文件时,我将使用 d,如果取决于与 d 中的第一个值关联的列表中有多少个值,我将输出成对都在 10 以内。第二个文件也按第二列排序。

虚假数据。 假设我们可以将 5 行数据放入内存,并且我们需要值的重叠也为 5。

1 1
2 1
1 6
7 6
1 16

现在 d 是 {1:[1,6,16],2:[1],7:[6]}。

对于下一个 block ,我们只需要保留最后一个值(如 16-6 > 5)。所以我们会设置

d 为 {1:[16]} 并继续阅读接下来的 4 行。

最佳答案

您是否尝试过 Pandas library ,特别是将数据读入 DataFrame,然后使用 groupby在第一列?

Pandas 可以让您有效地对数据进行大量批量操作,并且您可以 read it in lazily如果你愿意的话。

关于python - 分块处理大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17866572/

相关文章:

python - 将日志值转换回数字

python - 删除 Django 中的图像

python - 将列表字典转换为字典中列表中元素的所有组合的字典列表的最Pythonic方法?

python - 如何使用 python 从 firebase 获取当前登录帐户的 UID

python - 如何从命令行 python 获取列表作为输入?

python - 关于数据库设计基础的问题

python - 概念 - 如何在 Python 中构建 2D 词频矩阵?

python - 使用 Python 解析二进制文件

Python:从字典到数组的转换

python - 在符合条件的数据框中查找第一行