欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java查询大文本

程序员文章站 2022-05-31 22:22:53
...

  有时我们需要查询大文本而不是数据库,这时就需要流式读入文件并实现查询算法,还要进行并行处理以提高性能。但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的并行处理。

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

  下面举例说明集算器协助JAVA查询大文本的过程。

  源数据sOrder.txt如下:
Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本  

  要查询起止时间是startDate、endDate之间,金额大于argAmount的订单,只需使用如下代码:
Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本  

  使用函数cursor以游标方式打开文件,@t表示将第1行读为列名。之后进行结构化查询,查询结果不大的情况下可以用fetch读入内存,如下:
Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本  

  如果查询结果内存装不下,可以在集算器中直接返回游标(即去掉A3代码),在JAVA中只需用JDBC流式读取即可获得计算结果。

  集算器还可以实现多线程并行计算,最简单方法就是在上述代码的cursor函数中使用@m,这表示多线程读取文件。

  也可以手工分段,在读取和计算部分都使用多线程并行计算,代码如下:
Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本  

  上述代码用8个游标打开文件,每次读取文件的指定部分。@z表示按字节数将文件大致分为几部分,只读取其中一部分,集算器会自动去头补尾,以保证取出的数据是整行。

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

  上述代码使用了集算器内置的并行计算函数,如果计算过程较复杂,并且内存可以装下计算结果,则适合用显式并行计算语句。代码如下:
Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本  

  上述代码用8个子线程分别读取大文件,执行查询后再将结果返回给主线程。函数fork可执行子线程,作用范围B2-B3。线程内部可用A2来获取入口参数,线程外部可用A2获取所有线程的计算结果。

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

Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本  

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

  B4:按字节数定位到中间位置,打开游标读入一条记录,集算器会自动实现去头补尾,取出完整记录。如果定位成功,则将当前记录存储在C5。如果定位不成功,则继续比较集合大小并重新设置begin,end。

  • Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本 
  • 大小: 26 KB
  • Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本 
  • 大小: 21.4 KB
  • Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本 
  • 大小: 35.6 KB
  • Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本 
  • 大小: 23.9 KB
  • Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本 
  • 大小: 28.3 KB
  • Java查询大文本
            
    
    博客分类: Java相关 Javajdbc流失读取集算器并行大文本 
  • 大小: 41.6 KB