相关疑难解决方法(0)

在大型文本文件中搜索字符串 - 在python中分析各种方法

这个问题已被多次询问.花了一些时间阅读答案后,我做了一些快速分析,试用了前面提到的各种方法......

  • 我有一个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)

python performance search profiling large-files

40
推荐指数
3
解决办法
3万
查看次数

优化非丰富和算法

我正在尝试解决这个项目欧拉问题:

完美数字是一个数字,其正确除数的总和恰好等于数字.例如,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)

python

9
推荐指数
2
解决办法
3518
查看次数

具有数百万'url'字符串的sqlite数据库设计 - 从csv缓慢批量导入

我正在尝试通过导入带有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文件的两倍多.有什么方法可以减少吗?

sqlite search

4
推荐指数
1
解决办法
938
查看次数

标签 统计

python ×2

search ×2

large-files ×1

performance ×1

profiling ×1

sqlite ×1