将大型词典存储到 Python 中的文件中
Store large dictionary to file in Python
我有一本字典,里面有很多条目和一个巨大的向量作为值。这些向量可以有 60.000 个维度,我的字典中有大约 60.000 个条目。为了节省时间,我想在计算后存储它。但是,使用 pickle 会产生一个巨大的文件。我已尝试存储到 JSON,但文件仍然非常大(例如 50 个维度较小的条目样本中的 10.5 MB)。我也读过稀疏矩阵。由于大多数条目将为 0,因此这是可能的。这会减少文件大小吗?还有其他方法可以存储这些信息吗?还是我运气不好?
更新:
谢谢大家的回复。我想存储这些数据,因为这些是字数统计。例如,当给定句子时,我存储单词 0(在数组中的位置 0)出现在句子中的次数。显然所有句子中出现的单词比一个句子中出现的单词多,因此有很多零。然后,我想用这个数组来训练至少三个,也许六个分类器。创建带有字数统计的数组,然后 运行 整夜训练和测试分类器似乎更容易。我为此使用sklearn。选择这种格式是为了与其他特征向量格式保持一致,这就是我以这种方式解决问题的原因。如果这不是要走的路,在这种情况下,请告诉我。我非常清楚在高效编码方面我还有很多东西要学习!
我也开始实现稀疏矩阵。现在文件更大了(用 300 个句子的样本集测试)。
更新二:
谢谢大家的提示。 John Mee 不需要存储数据是对的。他和 Mike McKerns 都告诉我使用稀疏矩阵,这大大加快了计算速度!谢谢你的意见。现在我的武器库中有了新工具!
请参阅我对一个非常密切相关的问题的回答 ,如果您可以酸洗多个文件而不是单个文件。
另见: for other potential improvements, and here too: .
如果您使用 numpy
数组,它会非常有效,因为 klepto
和 joblib
都知道如何使用 array
的最小状态表示。如果您确实将数组的大多数元素都设为零,那么一定要转换为稀疏矩阵...您会发现数组的存储大小会大大节省。
正如上面的链接所讨论的,您可以使用 klepto
——它使您能够使用通用的 API 轻松地将字典存储到磁盘或数据库中。 klepto
还允许您选择一种存储格式(pickle
、json
等)——HDF5
即将推出。它可以利用专门的 pickle 格式(如 numpy
's)和压缩(如果你关心大小而不是速度)。
klepto
使您可以选择使用 "all-in-one" 文件或 "one-entry-per" 文件存储字典,还可以利用多处理或多线程——这意味着您可以保存和加载字典items to/from 后端并行。
60,000 个维度是指 60,000 个元素吗?如果是这种情况并且数字是 1..10 那么一个相当紧凑但仍然有效的方法是使用每个元素 1 个字节的 Python array.array
对象的字典(类型 'B'
).
内存中的大小应该是大约 60,000 个条目 x 60,000 字节,总共 3.35Gb 的数据。
该数据结构也被 pickle 到与磁盘大致相同的大小。
我有一本字典,里面有很多条目和一个巨大的向量作为值。这些向量可以有 60.000 个维度,我的字典中有大约 60.000 个条目。为了节省时间,我想在计算后存储它。但是,使用 pickle 会产生一个巨大的文件。我已尝试存储到 JSON,但文件仍然非常大(例如 50 个维度较小的条目样本中的 10.5 MB)。我也读过稀疏矩阵。由于大多数条目将为 0,因此这是可能的。这会减少文件大小吗?还有其他方法可以存储这些信息吗?还是我运气不好?
更新:
谢谢大家的回复。我想存储这些数据,因为这些是字数统计。例如,当给定句子时,我存储单词 0(在数组中的位置 0)出现在句子中的次数。显然所有句子中出现的单词比一个句子中出现的单词多,因此有很多零。然后,我想用这个数组来训练至少三个,也许六个分类器。创建带有字数统计的数组,然后 运行 整夜训练和测试分类器似乎更容易。我为此使用sklearn。选择这种格式是为了与其他特征向量格式保持一致,这就是我以这种方式解决问题的原因。如果这不是要走的路,在这种情况下,请告诉我。我非常清楚在高效编码方面我还有很多东西要学习!
我也开始实现稀疏矩阵。现在文件更大了(用 300 个句子的样本集测试)。
更新二: 谢谢大家的提示。 John Mee 不需要存储数据是对的。他和 Mike McKerns 都告诉我使用稀疏矩阵,这大大加快了计算速度!谢谢你的意见。现在我的武器库中有了新工具!
请参阅我对一个非常密切相关的问题的回答 ,如果您可以酸洗多个文件而不是单个文件。
另见: for other potential improvements, and here too: .
如果您使用 numpy
数组,它会非常有效,因为 klepto
和 joblib
都知道如何使用 array
的最小状态表示。如果您确实将数组的大多数元素都设为零,那么一定要转换为稀疏矩阵...您会发现数组的存储大小会大大节省。
正如上面的链接所讨论的,您可以使用 klepto
——它使您能够使用通用的 API 轻松地将字典存储到磁盘或数据库中。 klepto
还允许您选择一种存储格式(pickle
、json
等)——HDF5
即将推出。它可以利用专门的 pickle 格式(如 numpy
's)和压缩(如果你关心大小而不是速度)。
klepto
使您可以选择使用 "all-in-one" 文件或 "one-entry-per" 文件存储字典,还可以利用多处理或多线程——这意味着您可以保存和加载字典items to/from 后端并行。
60,000 个维度是指 60,000 个元素吗?如果是这种情况并且数字是 1..10 那么一个相当紧凑但仍然有效的方法是使用每个元素 1 个字节的 Python array.array
对象的字典(类型 'B'
).
内存中的大小应该是大约 60,000 个条目 x 60,000 字节,总共 3.35Gb 的数据。
该数据结构也被 pickle 到与磁盘大致相同的大小。