【问题标题】:python duplicate remove MemoryError problem [duplicate]python重复删除MemoryError问题[重复]
【发布时间】:2019-04-15 06:36:21
【问题描述】:

伙计们,我有一个文本大小为 38GB 的​​文件,我的系统内存 = 64 gig 我运行此代码以删除重复项,但键入 MemoryError

lines = open('file.txt', 'r').readlines()

lines_set = set(lines)

out  = open('b.txt', 'w')

for line in lines_set:
    out.write(line)

【问题讨论】:

  • 使用with open 而不是open

标签: python memory


【解决方案1】:

您的代码将整个文件加载到内存中:

lines = open('file.txt', 'r').readlines()

然后它分配更多的内存,缩放到文件的大小:

lines_set = set(lines)

如果您希望能够对大小接近或超过您拥有的内存量的文件进行操作,您需要避免一次将整个内容加载到内存中。

一种选择是边读边写,避免在内存中存储除正在操作的行之外的任何行,并使用散列而不是精确相等测试来执行重复数据删除。

例如:

seen = set()
with open('file.txt', 'r') as infile:
    with open('b.txt', 'w') as outfile:
        for line in infile:
            h = sha256(line)
            if h in seen:
                continue
            seen.add(h)
            outfile.write(line)

这仍然要求所有唯一行的哈希值都适合内存 - 但是这更接近每行 32 个字节。根据文件中行的长度,这可能不够好,也可能不够好。如果不够好,您可以将seen 集移动到辅助存储——即磁盘。出于性能原因,您可能希望在主内存(即 RAM)中保留一个初步过滤器。例如,在内存中保留一组 sha256 的前 4 或 8 个字节。如果您看到前缀在内存中seen 中,请仅查阅磁盘上的seen 集。

【讨论】:

  • NameError: name 'sha256' is not defined
  • 后512MG类型MemoryError
  • 我不知道什么是“MG”。
猜你喜欢
  • 2013-07-26
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
相关资源
最近更新 更多