`
datamachine
  • 浏览: 163433 次
社区版块
存档分类
最新评论

用集算器来处理大文本文件的字符串匹配

阅读更多

在进行文本处理时,经常会遇到对大文件进行字符串匹配情况。用命令行的grep\cat命令处理此类问题时,写法很简单,但效率太低,用高级语言处理此类问题虽然可以获得较高的运行效率,但代码编写复杂度却相当高。

集算器支持大文件字符串匹配和多线程并行计算,代码简洁性能优异,下面通过例子来看一下具体作法。

 

文件file1.txt存储着大量的字符串,现在需要找出以”.txt”结尾的行数据,并输出到result.txt中。部分源数据如下:



 

集算器代码:



    A1:以游标的形式打开文件。函数cursor并不会将数据全部读入内存,而是以游标(流)的方式打开文件,因此不会占据内存空间。函数cursor使用了默认参数,即:以tab为列分割符读入全部的字段,自动命名为_1_2_3…_n。对于本案例来说,只有一个字段_1

A2=A1.select(like@c(_1,"*.txt这句代码用来查询出游标A1里以“.txt”结尾的行数据。函数select执行查询,函数like进行字符串匹配,其中_1表示第一个字段。函数like还使用了选项@c,这表示匹配时不区分大小写。

值得注意的是,A2的运算结果是游标,仍然不会占据内存空间。只有遇到export/fetch/groups等函数时,集算器引擎才会分配合适的内存缓冲区,并将前面的游标计算自动转化为内存计算。。

A3=file("e:\\result.txt").export(A2),这句代码将最终计算结果写入文件。部分数据如下:



 

上面的匹配规则比较简单,如果遇到复杂的情况,那就需要使用正则表达式。比如:找出以“c:\windows”开头,且结尾名不是“.txt”的行数据。

函数regex可以进行正则表达式匹配,只需将A2改为:

         A1.regex@c("^c:\\\\windows.*(?<!\\\\(.txt)$)")

上面代码中,选项@c表示不区分大小写。

 

正则表达式虽然可以实现更复杂的匹配规则,但性能偏低,比如从2.13G的文件中找出以“.txt”结尾的行数据,在同样环境下测试,用正则表达式需要206秒,用普通表达式(select)只需要119秒。

 

事实上,普通表达式也可以实现很多逻辑较复杂的匹配规则,而且语法更加直观,学习成本更低。比如emp.txt存储着大量的用户信息,每条用户信息分为多个字段,字段之间用tab分割,第一行是字段名。现在要找出符合下列条件的数据:EId字段在100以内,Name字段的首字母是aBirthday字段大于1984-01-01。集算器代码如下:



 
函数cursor的选项@t表示将第一行读为列名,之后就可以使用列名来访问数据。

查询条件是三个,可以分别用EId>100like@c(Name,"a*")Birthday>=date("1984-01-01")来表示,条件之间是“与”的逻辑关系,可以用&&来表示。

 

前面的算法是串行,改成并行可以进一步提高性能,具体做法是用多个线程并行读取文件,每个线程都用游标访问文件的一部分,并同时进行集合计算,最后再将每个游标的结果合并。

在相同的硬件环境下对2.13G的大文进行测试,串行时平均耗时119秒,并行时平均耗时 56秒,性能提高一倍左右。例子中的算法复杂度较低,瓶颈会产生在硬盘读取上,如果进一步加大运算的复杂度,性能提升的幅度将会更大。

集算器并行计算的代码如下:

 


 

A1=4A1是分段数量,即将文件分成4段。分段数量,也就是实际执行时的并行数,一般不要超过CPU的核数,否则会形成排队等待,并不能提高性能。实际使用最大并行数量可以在选项中配置。

A2=A1.(file("e:\\file1.txt").cursor@z(;, ~:A1))

上面的代码按照分段数量生成4个游标。其中A1.(express)表示按照括号内的表达式依次计算A1的成员,括号内可用“~”来表示当前成员。A1一般是集合,比如["file1", " file2"][2,3]A1如果是从1开始的连续数字,比如[1,2,3,4],则可以简写成4.( express),案例中的代码就是这种情况。

括号内的表达式是file("e:\\file1.txt").cursor@z(;, ~:A1),其中函数cursor使用了选项@z,这表示将文件分段,用游标取其中的某一段。~:A1表示文件会被大致分为4(A1=4),当前取第~段。“~”是A1的当前成员,因此每个游标依次对应第1、第2、第3、第4段文件。

另外,之所以是“大致分”,是因为精确分会出现半行数据的情况,而集算器会去头补位,自动取出整行数据。

A3=A2.(~.select(like@c(_1,"*.txt")))这句代码针对A2中的每个游标(即~)进行计算,求出游标中符合条件的行数据。这里的计算结果仍然是四个游标。

A4=A3.conj@xm()这句代码将A3中的多个游标进行并行合并。

A5=file("e:\\result.txt”).export(A4),将最终计算结果输出到文件中。

 

集算器脚本不仅能在IDE中独立运行,也可以通过JDBC接口被JAVA程序调用,用法和普通数据库没有区别。单步的计算脚本还可以直接嵌入JAVA代码中,而无需脚本文件。比如前面的A1-A5是分步计算,其实可以合为一步:file("e:\\result.txt").export(4.(file("e:\\file1.txt").cursor@z(;, ~:4)).(~.select(like@c(_1, "*.txt"))).conj@xm())

 

在操作系统命令行也可以直接运行这种单步脚本,具体内容请参考相关文档。

  • 大小: 29 KB
  • 大小: 14.8 KB
  • 大小: 49.9 KB
  • 大小: 24.7 KB
  • 大小: 24 KB
0
5
分享到:
评论

相关推荐

    带通配符的字符串匹配算法

    在IT领域,字符串匹配是计算机科学中的一个基本问题,尤其在文本处理、数据搜索和模式识别等场景中广泛应用。带通配符的字符串匹配算法则是这个领域的延伸,它允许在模式字符串中包含特殊字符,如星号(*)或问号(?),...

    关键词搜索(字符串匹配)

    关键词搜索和字符串匹配是计算机科学中的重要概念,尤其在信息检索、文本分析和自然语言处理等领域有着广泛应用。这里我们将深入探讨这两个概念,并结合"语义搜索简易版"这个压缩包文件,来理解它们如何帮助我们从...

    BP文本分类:特征提取 首先对文本信息进行分词处理,采用基于字符串匹配的方法-源码

    "BP文本分类:特征提取 首先对文本信息进行分词处理,采用基于字符串匹配的方法"这个标题揭示了这个压缩包文件可能包含的代码或教程,主要涉及文本预处理和特征提取的步骤,以及一种特定的分词方法——基于字符串...

    qt实现转换文件字符集编码

    这段代码首先创建了GBK和UTF-8的解码器和编码器,然后读取GBK编码的文件内容,通过GBK解码器将其转换为字符串,接着使用UTF-8编码器将字符串编码为新的字节串,最后写入目标文件。 在实际项目中,你可能需要处理...

    x86汇编语言文本字符串查找替换程序

    本文将深入探讨一个使用x86汇编语言编写的文本文件字符串查找与替换程序,以及其设计原理和操作步骤。 一、程序设计基础 1. 指令集:x86汇编语言基于80x86处理器的指令集,如MOV(数据传输)、CMP(比较)、JMP...

    matlab开发-查找指定匹配字符串罗马集

    本项目专注于查找指定匹配字符串的罗马集,这涉及到字符串操作、算法设计以及可能的优化技术。具体来说,这个任务是计算一个关键字字符串与一组字符串之间的最短距离,以便找到最近的匹配项。下面我们将深入探讨这一...

    编译原理实验报告及源码,LR1 活前缀 字符串匹配

    在实验中,可能会实现一个简单的字符串匹配算法,例如Boyer-Moore或KMP算法,这些算法高效且适用于处理大规模文本。 实验报告将详细阐述LR1分析器的构造步骤,包括如何构建项目集、确定状态、生成LR1分析表,以及...

    匹配中文字符串的拼音首字母或英文字符串的首字母缩写,源码

    在IT行业中,中文字符串的拼音首字母匹配以及英文字符串的首字母缩写是常见的文本处理需求,尤其是在数据处理、搜索引擎优化、用户界面设计等领域。这个压缩包文件"GetHighlightAcronymLib"似乎提供了一个库或者工具...

    文本文件字节集寻找替换.rar

    在IT领域,文本文件字节集寻找替换是一个常见的任务,特别是在软件开发、数据处理和文本分析中。这个任务涉及到对文本文件的二进制表示进行操作,以查找特定的字节序列并用新的字节序列替换。下面我们将深入探讨这个...

    regexgen生成与一组字符串匹配的正则表达式

    总的来说,`regexgen` 是JavaScript开发者处理正则表达式问题的一个实用工具,尤其在处理大量字符串匹配需求时,能显著提高开发效率和代码质量。通过深入理解其原理和使用方法,开发者可以更好地应对复杂的文本处理...

    易语言文本实现匹配通配符

    4. **特殊处理**:处理特殊情况,如星号连续出现或出现在字符串开头、结尾,以及如何处理文本中的特殊字符等。 5. **返回匹配结果**:根据比较结果,决定返回真(匹配成功)或假(匹配失败)。 以下是一个简单的...

    一款在线文本批量替换工具,能自动识别文件编码类型,在线批量替换文本文件中的字符的asp原创程序.

    标题中的“一款在线文本批量替换工具”指的是一个Web应用程序,它允许用户上传文本文件并进行大规模的字符替换操作。这个工具的独特之处在于它能够“自动识别文件编码类型”,这意味着它可以处理不同格式的文本文件...

    实现字符串匹配汇编语言斐波那契数列的汇编语言.zip

    在这个主题中,我们将深入探讨如何使用汇编语言来实现字符串匹配算法以及斐波那契数列。 首先,让我们来看看字符串匹配算法。在计算机科学中,字符串匹配是寻找一个字符串(模式)在另一个字符串(文本)中出现的...

    python正则表达式匹配不包含某几个字符的字符串方法

    本文将分享如何使用Python正则表达式来匹配不包含特定字符集的字符串。 首先,我们来看一个基本的正则表达式匹配例子。假设我们要从一个字符串中找出所有以“https?”开头,后面跟着“://”,然后再以“.jpg”、“....

    易语言文件字符替换原始代码源码,易语言文件字符替换模块使用例

    在“易语言文件字符替换原始代码源码”这个主题中,我们主要探讨的是如何利用易语言来实现对文件中的特定字符或文本进行查找和替换的功能,这对于文本处理和数据清洗工作来说是至关重要的。 首先,我们要理解“文件...

    中文文本相似度匹配算法

    在中文文本处理中,分词是预处理的第一步,因为中文没有明显的空格来区分单词。IKAnalyzer是一个开源的Java实现的中文分词器,它支持多种分词模式,包括精确模式、全模式、关键词模式等,能够有效地将中文句子分割成...

    易语言源代码_文本文件字节集寻找替换.zip

    总之,"易语言源代码_文本文件字节集寻找替换.zip"这个压缩包中的源代码为我们提供了一个实践案例,展示了如何使用易语言处理文本文件,操作字节集,以及进行查找和替换操作。通过深入研究这个源代码,我们可以更好...

    完整版文本文件字节集寻找替换.rar

    在IT行业中,文本文件字节集寻找替换是一个常见的任务,特别是在数据处理、文本分析和编程领域。这个压缩包“完整版文本文件字节集寻找替换.rar”可能包含一系列的资源和教程,帮助用户理解如何在文本文件中查找特定...

    文本查找替换编辑器_文本查找替换编辑器_

    文本查找替换编辑器的核心功能是基于字符串匹配算法。常见的算法有朴素字符串匹配、KMP算法、Boyer-Moore算法等。这些算法能够帮助编辑器快速定位目标字符串,而替换操作则是在定位到的目标位置上进行内容修改。 2....

    zifuchuan.rar_字符串处理

    总的来说,字符串处理是编程中不可或缺的一部分,理解并熟练运用字符串处理技术,能够帮助开发者编写更高效、更健壮的代码,有效处理和分析文本数据。在实际工作中,无论是数据分析、网页爬虫还是日志分析,都离不开...

Global site tag (gtag.js) - Google Analytics