使用Python将大型字典存储到文件

Cas*_*sie 5 python storage dictionary store pickle

我有一本字典,其中包含许多条目和一个巨大的向量作为值。这些向量的尺寸可能是60.000,而且字典中有大约60.000条目。为了节省时间,我想在计算后将其存储。但是,使用泡菜导致文件很大。我尝试存储为JSON,但是文件仍然很大(例如,在尺寸较小的50个条目的样本上为10.5 MB)。我也读过关于稀疏矩阵的信息。由于大多数条目将为0,因此这是可能的。这会减少文件大小吗?还有其他方法可以存储此信息吗?还是我只是倒霉?

更新:

谢谢大家的答复。我想存储这些数据,因为这些是字数统计。例如,给定句子时,我存储单词0(在数组中的位置0)出现在句子中的次数。所有句子中的单词显然比一个句子中出现的单词多,因此有很多零。然后,我想使用此数组来训练至少三个(也许六个)分类器。创建带有单词计数的数组,然后在夜间运行分类器以进行培训和测试似乎更容易。我为此使用sklearn。选择此格式是为了与其他特征向量格式保持一致,这就是为什么我采用这种方式来解决问题。如果不是这样,在这种情况下,请告诉我。我非常意识到我在有效编码方面有很多东西要学习!

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

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

Mik*_*rns 3

如果您可以对多个文件而不是单个文件进行酸洗,请参阅我对一个非常密切相关的问题的回答/sf/answers/1767132321/ 。

另请参阅: https: //stackoverflow.com/a/21948720/2379433了解其他潜在的改进,也请参阅: https: //stackoverflow.com/a/24471659/2379433

如果您使用numpy数组,它可能非常高效,因为两者kleptojoblib了解如何使用array. 如果确实将数组的大多数元素都为零,那么无论如何,转换为稀疏矩阵......并且您会发现数组的存储大小节省了巨大的空间。

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

klepto使您可以选择使用“全合一”文件或“每个条目一个”文件存储字典,并且还可以利用多处理或多线程——这意味着您可以在后端保存和加载字典项目在平行下。