我正在用 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 数据库根本不支持连接,或者最多只支持简单连接。
- 需要支持一种将数据加载和存储为任何文件格式的方法。我目前正在通过提供一个框架来实现这一点,该框架可以根据需要轻松添加新格式。
- 它不需要持久性(除了像前一点那样存储数据),也不需要处理大量数据,即不超过几百万条记录。通常,我要处理几千个。