我有一本字典,里面有很多词条,还有一个巨大的向量作为值。这些向量可以是60.000维大,我在字典中有大约60.000个条目。为了节省时间,我想在计算之后存储这个。然而,使用泡菜导致了一个巨大的文件。我尝试过存储到JSON,但是文件仍然非常大(就像在50个尺寸较小的条目样本中的10.5 MB )。我还读过关于稀疏矩阵的文章。由于大多数条目为0,这是一种可能性。这会减少文件的大小吗?还有其他方法来存储这些信息吗?还是我只是运气不好?
更新:
谢谢大家的答复。我想存储这些数据,因为这些是字数。例如,当给定句子时,我存储单词0(在数组中的位置0)出现在句子中的次数。显然,所有句子中的单词比一个句子中出现的单词多,因此出现了许多零。然后,我想用这个数组训练至少三个,也许六个分类器。使用字数创建数组似乎更容易,然后在夜间运行分类器来进行训练和测试。我用滑雪板来做这个。选择这种格式是为了与其他特征向量格式保持一致,这就是为什么我用这种方式处理问题的原因。如果不是这样的话,请告诉我。我非常清楚,在高效编码方面,我还有很多需要学习的地方!
我还开始实现稀疏矩阵。这个文件现在更大了(用300句例句进行测试)。
更新2:谢谢大家的提示。约翰·梅是对的,他不需要存储数据。他和迈克McKerns都告诉我使用稀疏矩阵,这大大加快了计算速度!所以谢谢你的意见。现在我有了一个新的工具在我的武器库!
发布于 2015-01-21 00:41:52
请看我对一个非常密切相关的问题https://stackoverflow.com/a/25244747/2379433的回答,如果您可以对多个文件而不是单个文件进行腌制。
还请参阅:https://stackoverflow.com/a/21948720/2379433以获得其他潜在的改进,在这里也可以看到:https://stackoverflow.com/a/24471659/2379433。
如果您使用的是numpy数组,它可能非常高效,因为klepto和joblib都知道如何为array使用最小状态表示。如果数组的大多数元素都是零,那么无论如何,都要转换成稀疏矩阵.你会发现数组的存储大小有很大的节省。
正如上面的链接所讨论的那样,您可以使用klepto --它为您提供了使用公共API轻松地将字典存储到磁盘或数据库的能力。klepto还使您能够选择存储格式(pickle、json等) -- HDF5即将到来。它可以利用专门的泡菜格式(如numpy)和压缩(如果您关心的是大小而不是速度)。
klepto为您提供了将字典存储在“所有一体”文件或“每个条目”文件中的选项,还可以利用多线程或多线程--这意味着您可以并行地将字典项保存和加载到后端/从后端加载。
发布于 2015-01-21 01:02:05
六万维是指六万元素吗?如果是这种情况,并且数字是1..10,那么一种合理的紧凑但仍然有效的方法是使用Python对象的字典,每个元素具有一个字节(类型为array.array )。
内存中的大小应该是大约60000个条目x60000字节,总计3.35Gb的数据。
该数据结构也与磁盘的大小相同。
https://stackoverflow.com/questions/28057407
复制相似问题