python - 高效查询存储为 pickle 文件的两个大字典
问题描述
我有两个大泡菜文件。它们都存储了一本字典。我不能同时将两个泡菜文件加载到内存中,但是,我想合并存储在其中的字典并查询这个合并的字典。是否有可能做到这一点?请参阅以下片段以在我的查询中获得更多见解。
f1 = open('d1.pickle', 'rb')
d1 = pickle.load(f1)
# However, I can not load a second dictionary as follows in the same program
# because of memory limits
f2 = open('d2.pickle', 'rb')
d2 = pickle.load(f2)
f3 = open('d_final.pickle', 'wb')
pickle.dump({*d1, *d2}, f3)
更新:不知何故,我想对这两个字典进行更快的查询。我的一种方法是将这两个字典存储在一个 tsv 文件中,然后将行偏移存储为键的索引。使用这些偏移量,我们可以在该文件位置中查找并获取值。但这似乎比在字典上查询要慢得多。请参阅以下内容了解我的尝试。谁能评论这是否是查询这两个字典的最快方法?
f = open('merged_dict.tsv', 'wt')
f1 = open('d1.pickle', 'rb')
d1 = pickle.load(f1)
offsets = {}
for key in d1:
offset = f.tell()
f.write(key + '\t' + d1[key] + '\n')
offsets[key] = offset
del f1, d1
f2 = open('d2.tsv', 'rb')
d2 = pickle.load(f2)
for key in d2:
offset = f.tell()
f.write(key + '\t' + d2[key] + '\n')
offsets[key] = offset
f3 = open('dict_offets.pickle', 'wb')
pickle.dump(offsets, f3)
现在,当我需要查询字典时,我会执行以下操作:
f = open('merged_dict.tsv', 'rt')
f1 = open('dict_offsets.pickle', 'rt')
d = pickle.load(f1)
#query the dictionary using following function.
def query_dictionary(key):
offset = d[key]
f.seek(offset)
return f.readline().split('\t')[1]
我认为将字典存储为 tsv 文件的性能问题是因为值是 numpy 数组。我需要将字符串转换为 numpy 数组,这可能会影响查询性能。
如果这不是最好的方法,请有人为此提出更好的方法。再一次,我非常关心查询的效率。我想尽快从字典中获取值。
解决方案
推荐阅读
- javascript - 为什么 TFS 2017 Sonar Build Definition 给出 No valid rules have been specified 错误?
- c# - c#如何使用CompareTo比较类中的字符串?
- azure - Azure Set-AzureStorageBlobContent 更改大小块
- python - 如何在 .NET 应用程序中使用 IronPython 启用调试(断点、停止、检查变量、继续)?
- python - 关于 NumPy 数组切片何时是引用以及何时是副本的困惑
- ios - 无法使用新的 Xcode 10 和 mac Mojave 构建 ionic 3 项目
- angular - Angular 6 MatPaginator 不显示表格的 mat-option 并且不设置下一个按钮和后退按钮的样式
- sharepoint - 使用 SharePoint 的 REST API 获取 SharePoint 网站的请求摘要需要哪些权限?
- java - 执行带有附加依赖项的 spring-boot-jar
- regex - 使用正则表达式捕获特殊字符后的字符