2010-05-31 45 views
3

Python字典碰见我需要一个大(=巨大)Python字典,这竟然是相当存储器消耗的情况。然而,由于所有的值都是单一类型(长) - 以及键,我想我可以使用python(或numpy,并不重要)数组的值;并用一个实际使用这些数组作为键和值存储的对象包装所需的接口(in:x; out:d [x])。具有恒定值型

我可以使用一个索引转换对象(输入 - >索引,1..n的,其中n是不同值的计数器),并返回数组[索引]。我可以详细说明如何实现这种具有合理内存要求的索引方法的一些技巧,它的工作原理甚至相当不错。 但是,我想知道是否有这样一个数据结构对象已经存在(在Python中,或从C/++包装到Python中),在任何包中(我检查了集合和一些Google搜索)。

任何评论将受到欢迎,感谢。

+0

您应该考虑使用元组而不是列表,如果你还没有这样做的话; Python没有简单的“数组”,但元组肯定更具有内存效率,因为它不会保留插入空间。然而,由于哈希表的存在,字典仍然会咀嚼内存,因此您可能需要考虑使用已排序的数据结构并使用二分查找来查找所需的键,这些键映射到Tuple的索引。 – 2010-05-31 08:58:51

+0

你为什么想着简单的Python实现?可能值得寻找已经实施索引的任何现成的键值存储解决方案,例如东京内阁? – Vestel 2010-05-31 09:30:10

回答

2

这种任务的是一个典型的数据库类型的访问(在特定类型的列大容量的数据)。您将创建一个带索引键的简单表格,以便快速访问。我没有这方面的经验,但你可能想看看标准的sqlite3模块。

如果你的钥匙不随时间而改变,你可以或者把所有的数据在两个Python内存优化阵列(标准array模块);一个数组包含已排序的键,另一个数组包含相应的值。然后您可以通过优化的bisect.bisect函数找到关键指标。

+0

+1用于建议一个数据库和另一个Python解决方案。 – 2010-05-31 10:16:07

0

你可以尝试使用std :: map。 Boost.Python为std :: map开箱即用提供了一个Python包装。