【问题标题】:Working with data exceeded memory处理超出内存的数据
【发布时间】:2011-05-29 23:11:14
【问题描述】:

我有一个数据结构,它表示对象列表和它们之间的链接。每个对象都拥有一个字典,其属性甚至可以是嵌套的 Python 对象。

这些对象有时会超出可用内存,这是由于数量庞大,有时是由于单个大型属性。

是否有一种简单的方法可以在没有内存异常的情况下仍然处理此类数据?

如果我只有字符串和属性,我可以考虑图形数据库,但也许有一些更简单的东西可以让我保留我的 Python 数据结构。

【问题讨论】:

  • 您要么需要找到一种更有效的方式来表示它们,要么按位处理它们,要么将它们存储在磁盘上。哪些是有意义的,以及如何去做,真的取决于数据是什么以及你想用它们做什么。
  • 添加到 Thomas 的评论中,我建议将数据的“链接”部分抽象到它自己的对象中,并将其仅保存在内存中。如果这是可能的话,以便将“大属性”保留在磁盘上。

标签: python database memory


【解决方案1】:

有 4 个“真正的”解决方案和 2 个“真正想要的”解决方案:

  1. 修改架构,这样您就不会保留不需要的大量数据;也许您正在使用数据库并且不需要在查询中检索这些数据。
  2. 修改你的目标:也许你真的不需要处理这些事情。
  3. 将处理分成更小的块,确保释放未使用的对象以进行垃圾回收(通过释放所有引用)。
  4. 购买更多内存。

无需购买更多 RAM 的两种解决方案都需要使用硬盘。因此,它们将非常缓慢。但是,如果您的数据量很大(数百 GB),并且您必须浏览所有数据,这可能是您唯一的选择(闪存驱动器可能会提供很好的加速,但过多的写入会很快就把它穿下来)。

  1. 增加虚拟内存的大小。 (在 Linux 中,这是通过增加交换分区的大小或添加更多交换分区来实现的。)
  2. 将处理分成更小的块,通过垃圾收集将 RAM 中的内容卸载回磁盘,即使您可能再次需要它。

【讨论】:

  • 好的,所以我想我需要将对象的选定属性存储在硬盘上。假设我对每个对象都有一个 ID。从硬盘访问外包属性的最快方法是什么?
【解决方案2】:

嗯,你可以安装更多的内存;-)

这是迄今为止最简单的解决方案(尽管我不确定它在您的特定情况下是否可行),甚至可能是最便宜的(请记住更改代码的成本)。

只是一个需要注意的选项...

【讨论】:

  • 嗯,安装更多 RAM 是我自己能想到的解决方案,我不会要求它;)另外,以某种方式将东西存储在硬盘上,我可能也可以自己弄清楚。但是是否有一些类似数据库的框架可以帮助或多或少透明地做到这一点?
  • @Gerenuk:这是我能想到的最透明的解决方案(除了增加你的虚拟内存(我在这里假设是 Windows)和有很多磁盘交换——我认为这在技术上是透明的使用磁盘作为内存中太大对象的后备存储的方式)。其他任何事情都可能需要对代码进行重大更改——恐怕您需要分享模型的细节以获得更详细的答案。
  • 嗯,模型是许多带有存储属性的字典的对象。主要是字符串或数字,但偶尔会列出,将来可能还会更多。所有对象都保留对链接对象的引用,该引用基本上是引用列表。嗯,所以我可以尝试将选定的属性或链接表存储在硬盘上。有什么工具可以提供帮助吗?实际上,首先我想到了一些类似数据库的解决方案,它可以让我的对象透明地保存在硬盘上。
  • @Gerenuk:如果你还没有,你可能想看看PickleCerealizer,也许结合数据库。
  • 但是用泡菜我又一次只能加载所有东西?我不知何故需要在磁盘上存储许多属性,我需要通过我的 ID 选择性地访问这些属性。数据库将是一个选项,但是我需要打包任意 python 结构?!我想这就是你的意思。有现成的吗?
猜你喜欢
  • 1970-01-01
  • 2013-08-27
  • 2019-08-11
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多