这个问题已被多次询问.花了一些时间阅读答案后,我做了一些快速分析,试用了前面提到的各种方法......
- 我有一个600 MB的文件,有600 万行字符串(来自DMOZ项目的类别路径).
- 每行的条目都是唯一的.
- 我想加载文件一次并继续搜索数据中的匹配项
我在下面尝试的三种方法列出了加载文件所花费的时间,在任务管理器中搜索负匹配和内存使用的时间
1) set :
(i) data = set(f.read().splitlines())
(ii) result = search_str in data
Run Code Online (Sandbox Code Playgroud)
加载时间〜10s,搜索时间~0.0s,内存使用量~1.2GB
2) list :
(i) data = f.read().splitlines()
(ii) result = search_str in data
Run Code Online (Sandbox Code Playgroud)
加载时间~6s,搜索时间~0.36s,内存使用量~1.2GB
3) mmap :
(i) data = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
(ii) result = data.find(search_str)
Run Code Online (Sandbox Code Playgroud)
加载时间〜0s,搜索时间~5.4s,内存使用量~NA
4) Hash lookup (using code from @alienhard below):
Run Code Online (Sandbox Code Playgroud)
加载时间〜65s,搜索时间~0.0s,内存使用量~250MB
5) File search (using code from @EOL below):
with open('input.txt') …Run Code Online (Sandbox Code Playgroud) 我正在尝试解决这个项目欧拉问题:
完美数字是一个数字,其正确除数的总和恰好等于数字.例如,28的适当除数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完美数.
如果n的适当除数之和小于n,则数n被称为不足,如果该和超过n,则称其为n.
由于12是最小的有限数,1 + 2 + 3 + 4 + 6 = 16,可以写成两个有限数之和的最小数是24.通过数学分析,可以显示所有整数大于28123可以写成两个数字的总和.然而,即使已知不能表示为两个充裕数的总和的最大数量小于该限制,也不能通过分析进一步减小该上限.
找到所有正整数的总和,这些正整数不能写为两个数字的总和.
我的解决方案
#returns a list of the divisors of a given number
def Divs(Number):
Divisors = []
for i in range(2 , int(Number**0.5) + 1):
if Number % i == 0:
Divisors.append(i)
for q in range(len(Divisors)):
if Divisors[q] != (Number / Divisors[q]):
Divisors.append(Number / Divisors[q])
Divisors.insert(0,1)
return Divisors
#returns a list of abundant numbers …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过导入带有url的csv文件来创建一个sqlite数据库.该文件有大约600万字符串.这是我用过的命令
create table urltable (url text primary key);
.import csvfile urldatabase
Run Code Online (Sandbox Code Playgroud)
大约300万网址后,速度减慢了很多,我的硬盘不断旋转.我已经尝试将csv文件拆分为1/4块但我遇到了同样的问题.
我在stackoverflow上阅读了类似的帖子,尝试使用BEGIN...COMMIT块,PRAGMA synchronous=OFF但没有一个帮助.我能够创建数据库的唯一方法是从url中删除主键约束.但是,当我运行一个select命令来查找特定的url时,需要2-3秒,这对我的应用程序不起作用.在url上设置主键时,选择是即时的.请告诉我我做错了什么.
[编辑] 有助于提出的建议摘要:
仍然,使用主索引,数据库大小是我尝试导入的原始csv文件的两倍多.有什么方法可以减少吗?