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

2024-03-13

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

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


对于我的用例,只要我有足够的可用内存,使用该套件似乎是最佳选择。我希望得到一些关于这些问题的评论:

  1. A 更好的选择例如sqlite ?
  2. Ways to 使用 mmap 缩短搜索时间。我有 64 位设置。 [编辑] 例如布隆过滤器
  3. 随着文件大小增长到几 GB,有什么方法可以继续使用“set”,例如分成批次..

[编辑1]我需要经常搜索、添加/删除值,并且不能单独使用哈希表,因为我需要稍后检索修改后的值。

欢迎任何意见/建议!

[编辑2]更新答案中建议的方法的结果 [编辑3]使用sqlite结果更新

Solution:根据所有分析和反馈,我想我会选择 sqlite。第二种选择是方法 4。sqlite 的一个缺点是数据库大小是带有 url 的原始 csv 文件的两倍多。这是由于 url 上的主索引造成的


如果您需要启动许多连续搜索,则变体 1 非常有用。自从set内部是一个哈希表,它非常擅长搜索。不过,构建需要时间,并且只有当您的数据适合 RAM 时才能正常工作。

变体 3 适用于非常大的文件,因为您有足够的地址空间来映射它们,并且操作系统缓存了足够的数据。您进行全面扫描;一旦你的数据无法装入 RAM,它就会变得相当慢。

如果您需要按行进行多次搜索并且无法将数据装入 RAM,那么 SQLite 绝对是一个好主意。将字符串加载到表中,构建索引,然后 SQLite 为您构建一个漂亮的 B 树。即使数据不适合,树也可以适合 RAM(这有点像 @alienhard 提议的),即使不适合,所需的 I/O 量也会大大降低。当然,您需要创建一个基于磁盘的SQLite数据库。我怀疑基于内存的 SQLite 能否显着击败变体 1。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何 json_normalize() df 中的特定字段并保留其他列? [复制]

    这个问题在这里已经有答案了 这是我的简单示例 我的实际数据集中的 json 字段非常嵌套 因此我一次解压一层 我需要在 json normalize 之后保留数据集上的某些列 https pandas pydata org docs ref
  • 为 PyCharm 中的所有配置设置相同的环境变量

    我有一个与 Celery 和很多不同的工作人员一起的项目 如何避免每次将 PyCharm 中的环境变量复制粘贴到每个运行 调试配置 有什么方法可以在项目设置中设置它们吗 找到解决方案here https stackoverflow com
  • 使用 Python 中的 IAM 角色访问 AWS API Gateway

    我有一个 AWS API 网关 我想使用它来保护其安全IAM 角色 http docs aws amazon com apigateway latest developerguide permissions html 我正在寻找一个包来帮助
  • 在python中调用subprocess.Popen时“系统找不到指定的文件”

    我正在尝试使用svnmerge py合并一些文件 它在底层使用 python 当我使用它时 我收到一个错误 系统找不到指定的文件 工作中的同事正在运行相同版本的svnmerge py 以及 python 2 5 2 特别是 r252 609
  • 一起使用 Argparse 和 Json

    我是 Python 初学者 我想知道 Argparse 和 JSON 是否可以一起使用 说 我有变量p q r 我可以将它们添加到 argparse 中 parser add argument p param1 help x variabl
  • 快速 log2(float x) 实现 C++

    我需要在 C 中非常快速地实现 log2 float x 函数 我发现了一个非常有趣的实现 而且速度非常快 include
  • 熊猫记忆

    我有冗长的计算 我重复了很多次 因此 我想使用记忆 诸如jug http packages python org Jug and joblib http packages python org joblib memory html 与Pan
  • Pandas,按最大返回值进行分组 AssertionError:

    熊猫有问题 我想听听你的意见 我有这个数据框 我需要在其中获取最大值 代码就在下面 df stack pd DataFrame 1 0 2016 0 NonResidential Hotel 98101 0 DOWNTOWN 47 6122
  • 将具有不同大小的行的数据加载到 Numpy 数组中

    假设我有一个包含如下数据的文本文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 如何将它加载到 numpy 数组中 使其看起来像这样 1 2 3 4 5 0 6 7 8 0 0 0 9 1
  • 如何获取 Matplotlib 生成的散点图的像素坐标?

    我使用 Matplotlib 生成散点图的 PNG 文件 现在 对于每个散点图 除了 PNG 文件之外 我还会also就像生成散点图中各个点的像素坐标列表一样 我用来生成散点图 PNG 文件的代码基本上是这样的 from matplotli
  • 如何将reportlab与Google应用程序引擎一起使用

    我无法在谷歌应用程序引擎下正确导入reportlab 根据以下guide http blog notdot net 2010 04 Generating PDFs on App Engine Python and introducing M
  • django如何将字符串转换为模块?

    我试图了解 django 的另一个神奇之处 它可以将字符串转换为模块 In settings py INSTALLED APPS声明如下 INSTALLED APPS django contrib auth django contrib c
  • 使用 pandas 绘制带有误差线的条形图

    我正在尝试从 DataFrame 生成条形图 如下所示 Pre Post Measure1 0 4 1 9 这些值是我从其他地方计算出来的中值 我还有它们的方差和标准差 以及标准误差 我想将结果绘制为具有适当误差线的条形图 但指定多个误差值
  • Python列表对象属性“append”是只读的

    正如标题所说 在Python中 我试图做到这一点 以便当有人输入一个选择 在本例中为Choice13 时 它会从密码列表中删除旧密码并添加新密码 passwords mrjoebblock mrjoefblock mrjoegblock m
  • Python“self”关键字[重复]

    这个问题在这里已经有答案了 我是 Python 新手 通常使用 C 最近几天开始使用它 在类中 是否需要在对该类的数据成员和方法的任何调用前添加前缀 因此 如果我在该类中调用方法或从该类获取值 我需要使用self method or sel
  • 字母尺度和随机文本上的马尔可夫链

    我想使用 txt 文件中的一本书中的字母频率生成随机文本 以便每个新字符 string lowercase 取决于前一个 如何使用马尔可夫链来做到这一点 或者使用每个字母都有条件频率的 27 个数组更简单 我想使用来自的字母频率生成随机文本
  • 使用Python重命名目录中的多个文件

    我正在尝试使用以下 Python 脚本重命名目录中的多个文件 import os path Users myName Desktop directory files os listdir path i 1 for file in files
  • Django - 缺少 1 个必需的位置参数:'request'

    我收到错误 get indiceComercioVarejista 缺少 1 个必需的位置参数 要求 当尝试访问 get indiceComercioVarejista 方法时 我不知道这是怎么回事 views from django ht
  • 将数组从 .npy 文件读入 Fortran 90

    我使用 Python 以二维数组 例如 X 的形式生成一些初始数据 然后使用 Fortran 对它们进行一些计算 最初 当数组大小约为 10 000 x 10 000 时 np savetxt 在速度方面表现良好 但是一旦我开始增加数组的维
  • 从 Flask 中的 S3 返回 PDF

    我正在尝试在 Flask 应用程序的浏览器中返回 PDF 我使用 AWS S3 来存储文件 并使用 boto3 作为与 S3 交互的 SDK 到目前为止我的代码是 s3 boto3 resource s3 aws access key id

随机推荐