将大型字典存储到Python文件中

时间:2015-01-20 23:59:42

标签: python dictionary storage store pickle

我有一个包含许多条目的字典和一个巨大的矢量作为值。这些向量可以是60.000维度大,我在字典中有大约60,000个条目。为了节省时间,我想在计算后存储它。然而,使用泡菜导致了一个巨大的文件。我已经尝试存储到JSON,但文件仍然非常大(对于50个条目的样本,样本为10.5 MB)。我还读过有关稀疏矩阵的内容。由于大多数条目将为0,这是可能的。这会减少文件大小吗?有没有其他方法来存储这些信息?或者我只是不走运?

更新

谢谢大家的回复。我想存储这些数据,因为这些是字数。例如,当给定句子时,我存储在句子中出现单词0(在数组中的位置0处)的次数。所有句子中的单词明显多于一个句子中出现的单词,因此有很多零。然后,我想使用这个数组训练至少三个,也许六个分类器。创建具有字数的数组似乎更容易,然后运行分类器过夜进行训练和测试。我使用sklearn。选择此格式与其他特征向量格式一致,这就是我以这种方式处理问题的原因。如果这不是要走的路,在这种情况下,请告诉我。我非常清楚我在编码方面有很多东西需要学习!

我也开始实现稀疏矩阵。该文件现在甚至更大(使用300个句子的样本集进行测试)。

更新2: 谢谢大家的提示。 John Mee是正确的,不需要存储数据。他和Mike McKerns都告诉我使用稀疏矩阵,这大大加快了计算速度!谢谢你的意见。现在我在我的武器库中有了一个新工具!

2 个答案:

答案 0 :(得分:0)

如果你可以腌制几个文件而不是单个文件,请查看我对一个非常密切相关的问题https://stackoverflow.com/a/25244747/2379433的回答。

另请参阅:https://stackoverflow.com/a/21948720/2379433了解其他可能的改进,此处也是:https://stackoverflow.com/a/24471659/2379433

如果您使用numpy数组,则效率非常高,因为kleptojoblib都了解如何使用array的最小状态表示。如果你确实将数组的大多数元素都作为零,那么无论如何,转换为稀疏矩阵......你会发现数组的存储大小可以节省很多。

正如上面的链接所讨论的那样,您可以使用klepto - 这使您能够使用通用API轻松地将字典存储到磁盘或数据库。 klepto还允许您选择存储格式(picklejson等) - 其中HDF5即将推出。它可以使用专门的泡菜格式(如numpy' s)和压缩(如果您关心尺寸而不是速度)。

klepto为您提供了使用" all-in-one"存储字典的选项。文件或" one-entry-per"文件,也可以利用多处理或多线程 - 这意味着您可以并行地向/从后端保存和加载字典项。

答案 1 :(得分:0)

60,000个尺寸是指60,000个元素吗?如果是这种情况并且数字是1..10那么一个相当紧凑但仍然有效的方法是使用Python array.array对象的字典,每个元素1个字节(类型'B')。

内存大小应该是大约60,000个条目x 60,000个字节,总共3.35Gb的数据。

该数据结构也被腌制到与磁盘大小相同的大小。