【问题标题】:Sparse array of dicts - efficient representation字典的稀疏数组 - 有效的表示
【发布时间】:2014-05-24 01:33:57
【问题描述】:

在我的一个程序中,我使用了一个稀疏的数据数组,它目前被实现为一个整数索引的字典,如下所示:

{
   0: {some dict with data},
   1: {some similar but yet different dict},
   10: {...},
   100: {...},
   200: {...},
   etc
}

事实证明,这个 dict 对于我的目的来说占用了太多的内存。有没有办法更有效地存储稀疏数组?为了减少内存消耗,我准备牺牲访问时间毫秒。关键范围为0..0xFFFFFF,稀疏度约为30%。

虽然第 3 方模块可能是一个选项,但我对纯 Python 解决方案更感兴趣。

谢谢。

为了澄清,内部 dicts 不受优化,我只是试图以更好的方式安排它们。为简单起见,让我们假设我有字符串而不是字典:

data = {
   0: "foo",
   1: "bar",
   10: "...",
   100: "...",
   200: "...",
   etc
}

【问题讨论】:

  • 不确定您的意思,您使用的内存与您的值一样多,不确定这“占用太多内存”是如何产生的,不就是您需要的内存量吗?或者,也许你在问压缩?也许这有帮助:stackoverflow.com/questions/10264874/…
  • @Lawrence:这不一定是真的:字典有一些开销。举个简单的例子,比较sys.getsizeof([("a", 1), ("b", 2)])sys.getsizeof({"a": 1, "b": 2})
  • @DavidRobinson:是的,但是开销非常小,而且很可能无法变得更小,而不是纯 python。也许如果数据中存在模式,则可以通过不同的排列或自定义“压缩”算法来实现...
  • 内部字典中有什么样的数据?这种结构的内存消耗是由内部dicts支配的,所以在不了解它们的情况下,不可能给出有用的答案。
  • 我知道这就是您所希望的。我想说的是,你不可能通过这种方式获得任何东西。至少 95% 的内存消耗是由你的内心决定的。即使您设法将外部 dict 的消耗量压缩了 10 倍,您的总内存消耗最多也只能减少到 95.5%,这几乎没有帮助。

标签: python arrays python-2.7 dictionary sparse-matrix


【解决方案1】:

如果结构是映射,那么类 dict 对象确实是正确的选择,如果内存是一个问题,那么显而易见的解决方案是改用文件。最简单的方法可能是使用pandas 系列,它可以用作dict,并且可以直接通过HDF5 文件工作(参见http://pandas.pydata.org/pandas-docs/stable/io.html#hdf5-pytables

或者,对于纯 Python 解决方案,您可以使用 shelve 模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    相关资源
    最近更新 更多