这个问题已经被问过很多次了。花了一些时间阅读答案后,我做了一些快速分析来尝试前面提到的各种方法......
- 我有一个600 MB文件与600万字符串行(DMOZ 项目的类别路径)。
- 每行的条目都是唯一的。
- 我想要load文件once & 不停寻找用于数据中的匹配
下面我尝试的三种方法列出了加载文件所需的时间、搜索时间负匹配& 任务管理器中的内存使用情况
1) set :
(i) data = set(f.read().splitlines())
(ii) result = search_str in data
加载时间 ~ 10 秒,搜索时间 ~ 0.0 秒,内存使用 ~ 1.2GB
2) list :
(i) data = f.read().splitlines()
(ii) result = search_str in data
加载时间 ~ 6 秒,搜索时间 ~ 0.36 秒,内存使用 ~ 1.2GB
3) mmap :
(i) data = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
(ii) result = data.find(search_str)
加载时间 ~ 0 秒,搜索时间 ~ 5.4 秒,内存使用 ~ NA
4) Hash lookup (using code from @alienhard below):
加载时间 ~ 65 秒,搜索时间 ~ 0.0 秒,内存使用 ~ 250MB
5) File search (using code from @EOL below):
with open('input.txt') as f:
print search_str in f #search_str ends with the ('\n' or '\r\n') as in the file
加载时间 ~ 0 秒,搜索时间 ~ 3.2 秒,内存使用 ~ NA
6) sqlite (with primary index on url):
加载时间 ~ 0 秒,搜索时间 ~ 0.0 秒,内存使用 ~ NA
对于我的用例,只要我有足够的可用内存,使用该套件似乎是最佳选择。我希望得到一些关于这些问题的评论:
- A 更好的选择例如sqlite ?
- Ways to 使用 mmap 缩短搜索时间。我有 64 位设置。
[编辑] 例如布隆过滤器
- 随着文件大小增长到几 GB,有什么方法可以继续使用“set”,例如分成批次..
[编辑1]我需要经常搜索、添加/删除值,并且不能单独使用哈希表,因为我需要稍后检索修改后的值。
欢迎任何意见/建议!
[编辑2]更新答案中建议的方法的结果
[编辑3]使用sqlite结果更新
Solution:根据所有分析和反馈,我想我会选择 sqlite。第二种选择是方法 4。sqlite 的一个缺点是数据库大小是带有 url 的原始 csv 文件的两倍多。这是由于 url 上的主索引造成的