代码之家  ›  专栏  ›  技术社区  ›  Cassie

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

  •  5
  • Cassie  · 技术社区  · 11 年前

    我有一本字典,里面有很多条目和一个巨大的向量作为值。这些向量可以是60000维大,我在字典中有大约60000个条目。为了节省时间,我想在计算后存储它。然而,使用泡菜导致了一个巨大的文件。我已经尝试过将其存储为JSON,但文件仍然非常大(例如50个维度较小的条目的样本中有10.5MB)。我也读过稀疏矩阵。由于大多数条目将为0,这是一种可能性。这会减少文件大小吗?是否有其他方法存储此信息?还是我只是运气不好?

    更新:

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

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

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

    2 回复  |  直到 11 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    看看我对一个非常相关问题的回答 https://stackoverflow.com/a/25244747/2379433 ,如果您可以酸洗到多个文件而不是单个文件。

    另请参见: https://stackoverflow.com/a/21948720/2379433 其他潜在的改进,这里也是: https://stackoverflow.com/a/24471659/2379433 .

    如果您正在使用 numpy 阵列,它可以非常有效,因为两者 klepto joblib 了解如何对 array 。如果您确实将数组的大部分元素作为零,那么无论如何,转换为稀疏矩阵。。。并且您会发现阵列的存储容量大大节省。

    正如上面的链接所讨论的,您可以使用 盗窃犯 --它为您提供了使用通用API将字典轻松存储到磁盘或数据库的能力。 盗窃犯 还允许您选择存储格式( pickle , json 等等)--其中 HDF5 即将到来。它可以使用两种特殊的泡菜格式(如 numpy的复数 的)和压缩(如果您关心大小而不是速度)。

    盗窃犯 您可以选择使用“一体式”文件或“每个文件一个条目”来存储字典,还可以利用多处理或多线程——这意味着您可以并行地将字典项保存到后端或从后端加载字典项。

        2
  •  0
  •   6502    11 年前

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

    内存大小应为60000个条目x 60000字节,总计3.35Gb数据。

    该数据结构的大小也与磁盘大小相同。