【问题标题】:Handling large list of lists in python在python中处理大量列表
【发布时间】:2020-05-15 12:56:20
【问题描述】:

我有这个数学任务,我应该在其中找到一些组合等。没关系,问题是我正在尝试使用 itertools 模块来完成它,它在较小的组合上运行良好(6 - 地方),但现在我想对大型组合(18 个位置)做同样的事情,所以在这里我遇到了问题,因为我只有 8GB 的​​ RAM,而这个列表大约有 5GB,并且随着我的系统运行它消耗所有 RAM,然后程序下降内存错误。所以我的问题是:我正在使用的方法(下面的代码)有什么好的替代方法?

poliedar_kom = list(itertools.combinations_with_replacement(range(0, 13), 18)) poliedar_len = len(poliedar_kom)

所以当我有这个列表并且它的长度时,程序的其余部分将遍历列表中的每个值并检查另一个较小列表中的值的条件。正如我已经说过的那样,这是个问题,因为这个列表对于我的电脑来说太大了,但我可能做错了什么。

注意:我使用的是最新的 Python 3.8 64 位

总结:我的列表太大,我必须循环检查条件值。

编辑:感谢所有答案,我现在必须尝试,如果您对问题有任何新的可能解决方案,请发布。

编辑 2:谢谢大家,你们帮了我很大的忙。我标记了指向 Youtube 视频的答案,因为它让我意识到我的代码已经是生成器。谢谢大家!!!

【问题讨论】:

  • 你尝试过使用生成器吗?如果您真的只需要遍历数据,这可能会起作用
  • 我现在正在阅读有关生成器的内容,我认为它可能会起作用,因为我设法将该列表保存到 .txt 文件中,并且每一行都是一个值。你能指出我可以看到这个例子的地方吗,因为我以前从未使用过这些。

标签: python database list memory itertools


【解决方案1】:

对大数据范围使用生成器,代码的时间和空间复杂度不会随着大数据量呈指数级增长,详情请参考链接:

https://www.youtube.com/watch?v=bD05uGo_sVI

【讨论】:

    【解决方案2】:

    对于任何需要超过 1e4 个项目的应用程序,您应该避免使用 python 列表,这些列表非常占用内存和处理器

    对于此类用途,我一般会使用 numpy 数组或 pandas 数据帧

    如果您对这些不满意,是否可以通过某种方式重构您的算法,这样您就不会像使用生成器那样一次将每个值都保存在内存中?

    【讨论】:

    • 感谢您的回复,我不是 Python 方面的专家,所以如果您能指出一些有关如何使用 numpy 数组的指南?
    • Numpy 数组是类 C 的数据结构。它们的大部分效率来自于您在初始化时分配内存,并且此后大小是不可变的。更多信息,这是一个初学者指南:towardsdatascience.com/getting-started-with-numpy-59b22df56729
    【解决方案3】:

    在你的情况下!

    1) 不是将这些数据存储在 RAM 中,而是存储在文件中或 HDD/SDD 中的某个文件中(比如一些 SQL 数据库或 NoSQL 数据库)

    2) 编写一个生成器,一个接一个地处理整个列表中的每个列表(一组列表以提高效率)直到结束

    最好使用 mongodb 或 mysql/mariadb/postgresql 之类的东西来存储这么多数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 2010-12-12
      • 2023-02-13
      • 1970-01-01
      相关资源
      最近更新 更多