我正在使用Python和pickle
模块。我需要在不同的文件中存储几个结构相似的大字典,然后创建一个查找,逐个遍历键,并处理所有字典中包含的该键的数据。
基本上,我将每天有一本字典,结构为:
daily_dict = {
'a': <complex structure of data>,
'a1': <complex structure of data>,
...
'key_K': <complex structure of data>,
...
}
数据的复杂结构是另一个字典,它包含几个字段(包含列表),之后我应该处理这些字段。在外部处理之前没有办法减少这些字段的大小,因为我必须在提取我需要的特征之前汇总几天的数据。
我想创建字典:
merged_dict = {
'a': processing of all 'a' keys in all daily dictionaries,
...
}
所以基本上我需要循环键并按键合并字典,然后相应地处理它们。问题是,使用pickle模块,我必须在读取键之前加载所有文件。
我只能处理每天的数据,然后在存储中间结果后循环键,因为我每次解析每天的数据,我不能把所有的东西都保存在内存中。
每个字典在pickle时最多占用2gb,因此在另一个循环中再次加载它们需要很长时间,并且正如我所说的,我不能一次将它们全部放在内存中。
最后,您可以猜到,我有大小限制,因为我必须处理大量数据,所以我不能更改为占用太多空间的格式。如果数据读取速度更快,我可以使用折衷,但我宁愿避免这种情况。
我想知道是否有一些更聪明的方法来存储它们,因为我不需要一次读取所有的数据,而是一次只读取文件的一部分(单个键或一堆键)。
我的想法是创建单独的文件,键按字母顺序排序,所以我可以读取每个字典的块,而不是加载整个,我不需要查找表(例如,我可以很容易地读取所有以字母"a"开头的键)。我认为这种方式是可行的,但是我想知道是否有更有效的方式,因为这样会使文件高度不平衡。
很抱歉,我不能分享字典的内容,只能分享结构。
Pickle加载和转储是一个原子操作,因此您必须处理大量数据才能仅检索单个键的值。我建议引入像redis这样的db/k/value,它可以轻松处理大量数据。Python驱动器易于使用,该解决方案可让您拥有所有可用数据。事实上,这个功能reddi -dict可以让你像使用字典一样透明地使用redis,所以这对现有代码的影响很小。