0

我正在用 Python 构建一个灵活、轻量级的内存数据库,并发现我查找值和使用索引的方式存在性能问题。为了改善这一点,我尝试了一些选项,试图在速度和内存使用之间取得平衡。我当前的实现使用 dicts 的 dict 按记录(对象引用)和字段(也是对象引用)存储数据。因此,例如,如果我有三个包含三个字段的记录,其中一些数据丢失(即 NULL 值)::

{<Record1>: {<Field1>: 4, <Field2>: 'value', <Field3>: <Other Record>},
{<Record2>: {<Field1>: 4, <Field2>: 'value'},
{<Record3>: {<Field1>: 5}}

我考虑过一个 numpy 数组,但我仍然需要两个字典来将对象实例映射到数组索引,所以我看不出它的性能会更好。

索引是使用一对二等分列表实现的,本质上充当从值到记录实例的映射。例如,上面的索引Field1>

[[4, 4, 5], [<Record1>, <Record2>, <Record3>]]

我之前使用的是一个简单的 bin 字典,但这不允许范围查找(例如所有值 > 5)(请参阅Python hash table for blur matching)。

我的问题是这个。我担心我有多个对象引用,以及索引中相同值的多个副本。所有这些重复的引用实际上是否使用了更多的内存,或者在 python 中引用很便宜?我的替代方法是尝试为每个对象关联一个数字键,这可能会将事情至少提高到 256,但我对 python 如何处理引用的了解不够,无法知道这是否真的会更好。

有没有人有更好的管理方法的建议?

在 C 中重新实现关键部分是我想保留的最后选择。

对于任何感兴趣的人,我的代码在这里

编辑1:

简单来说,问题是以下哪一项在内存使用方面更有效,其中a是对象实例并且i是整数:

[a] * 1000

或者

[i] * 1000, {a: i}

编辑2:

由于大量评论建议我使用现有系统,以下是我的要求。如果有人可以提出一个可以满足所有这些要求的系统,那就太好了,但到目前为止,我还没有找到任何可以满足的系统。否则,我最初的问题仍然与python中引用的内存使用有关。:

  • 必须是轻量级和内存中的。绝对不是客户端/服务器模型。
  • 需要能够在运行中轻松更改表、更改字段、更改规则等。
  • 需要轻松应用非常复杂的验证规则。SQL 不满足此要求。尽管有时可以建立非常复杂的语句,但这绝非易事。
  • 需要支持表之间的连接和关联。许多 NoSQL 数据库根本不支持连接,或者最多只支持简单连接。
  • 需要支持一种将数据加载和存储为任何文件格式的方法。我目前正在通过提供一个框架来实现这一点,该框架可以根据需要轻松添加新格式。
  • 它不需要持久性(除了像前一点那样存储数据),也不需要处理大量数据,即不超过几百万条记录。通常,我要处理几千个。
4

3 回答 3

1

每个引用实际上都是一个指针,每个指针都需要少量内存。

您可以使用内存分析器 逐行查看内存使用情况。通过这种方式,您可以看到当您参考时会发生什么。

于 2012-12-03T14:25:36.860 回答
0

FWIW,我在 100x100 结构上运行了一些测试,测试了一个稀疏填充的字典结构、一个完全填充的字典结构、一个列表和一个 numpy 数组。后两者有一个将对象引用映射到索引的字典。我定时按索引获取结构中的每个项目(返回稀疏字典中缺失数据的哨兵),并报告总大小。我的结果有点令人惊讶:

Structure     Time     Size
============= ======== =====
full dict     0.0236s  6284
list          0.0426s  13028
sparse dict   0.1079s  1676
array         0.2262s  12608

所以最快和第二小的是一个完整的字典,可以推测是因为不需要对其进行key in dict检查。

于 2012-12-05T13:54:35.393 回答
0

Python 没有为动态内存管理指定特定的实现,但从语言的语义可以假设引用使用类似于 C 指针的内存。

于 2012-12-03T14:22:38.367 回答