• 热门专题

Java查询大文本文件的处理方法

作者:  发布日期:2015-06-16 21:30:37
Tag标签:文本  文件  方法  
  • 有时我们需要查询大文本而不是数据库,这时就需要流式读入文件并实现查询算法,还要进行并行处理以提高性能。但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的并行处理。

    使用免费的集算器可以弥补这一不足。集算器封装了丰富的结构化文件读写和游标计算函数,书写简单代码就能实现并行计算,并提供了易用的JDBC接口。JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果。

    集算器与Java应用程序的集成结构如下:


    下面举例说明集算器协助JAVA查询大文本的基本过程。源数据sOrder.txt如下:


    要查询起止时间是startDate、endDate之间,金额大于argAmount的订单,只需使用如下代码:


    A1:以游标方式打开文件。@t表示将第1行读为列名。

    A2:进行结构化查询,结果为游标。

    A3:执行游标,将结果读入内存,如下:

    QTEuc2VsZWN0KE9yZGVyRGF0ZSZndDs9ZGF0ZShcJnF1b3Q7MjAxMC0wMS0wMVwmcXVvdDspICZhbXA7JmFtcDtPcmRlckRhdGUmbHQ7PWRhdGUoXCZxdW90OzIwMTAtMTItMzFcJnF1b3Q7KSAmYW1wOyZhbXA7IEFtb3VudCZndDsyMDAwKVxuJnF1b3Q7JiM0Mzs8L3A+CjxwPiAgICAgICAgICAgICAgICAgICAgICAgICZxdW90Oz1BMi5mZXRjaCgpJnF1b3Q7KTs8L3A+CjxwPiAgICAgICAgvK/L48b3u+G3tbvY1+6689K7uPax7bTvyr21xCYjMjA1NDA7oaM8L3A+CjxwPiA8L3A+CjxwPiAgICAgICAgyOe5+7Lp0a+94bn7xNq05tewsrvPwqOsv8nS1NTavK/L48b31tDWsb3Tt7W72NPOseqjqLy0yKW19EEztPrC66Opo6zU2kpBVkHW0Na70OjJ6NbDw7/F+rTOtsHIobXEvMfCvMr9vLS/ydX9s6O2wciho6y+38zltPrC68jnz8KjujwvcD4KPHA+ICAgICAgICAgICAgICAgICAgICBzdC5zZXRGZXRjaFNpemUoMTAwMCk8L3A+CjxwPiAgICAgICAgudjT2ryvy+PG90pEQkO1xLK/yvC6zbX308O1xLj8z+rPuNDFz6K/ybLOv7w8c3Ryb25nPryvy+PG97yvs8nTptPD1q6xu0pBVkG199PDPC9zdHJvbmc+oaM8L3A+CjxwPiA8L3A+CjxwPiAgICAgICAgvK/L48b3u7m/ydLUyrXP1jxzdHJvbmc+tuDP37PMsqLQ0LzGy+M8L3N0cm9uZz6jrNfuvPK1pbe9t6i+zcrH1NrJz8r2tPrC67XEY3Vyc29yuq/K/dbQyrnTw0Bto6zV4rHtyr624M/fs8y2wcihzsS8/qGjPC9wPgo8cD4gICAgICAgINKyv8nS1MrWuaS31rbOo6zU2rbByKG6zbzGy+Oyv7fWtrzKudPDtuDP37PMsqLQ0LzGy+OjrLT6wuvI58/Co7o8L3A+Cgo8aW1nIHNyYz0="http://www.it165.net/uploadfile/files/2015/0616/20150616193810537.jpg" alt="">

    A1:用8个游标打开文件,每次读取文件的指定部分。~表示循环变量,依次是1、2…8,@z表示将文件按字节数大致分为几部分,只读取其中一部分,集算器会自动去头补尾,以保证取出的数据是整行。

    A2:针对每个游标执行查询。

    A3:并行执行游标,并合并结果。@x表示合并的对象是游标,@m表示并行计算。需要注意的是,函数conj无法保证结果顺序和源数据一致。

    上述代码使用了集算器内置的并行计算函数,如果计算过程较复杂,或内存可以装下计算结果,则适合用显式并行计算语句。代码如下:


    A1:设定并行数。

    A2:并行执行代码,作用范围是缩进的B2-B3。to(A1)=[1,2…8]表示每个线程的入口参数。线程内部可用A2来获取入口参数,线程外部可用A2获取所有线程的计算结果。

    B3:查询游标,将结果读入内存,并返回给主线程。

    A4:按顺序合并各线程的计算结果。

    对于有序数据,可以用二分法来提高查询性能。比如数据已按Client和OrderID排序,现在要根据参数argClient和argOrder找出相应的记录,可以使用下面的代码:


    begin,end是二分法的起止位置,m是中间位置。

    B4:按字节数定位到中间位置,打开游标读入一条记录,集算器会自动实现去头补尾,取出完整记录。@x表示取出记录后立即关闭游标。

    B5-C6:如果定位成功,则将当前记录存储在C5。

    B7-C8:如果定位不成功,则继续比较集合大小并重新设置begin,end。

    A9:将C5中的计算结果显式地返回给JDBC。


About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规