Java查询大文本文件的处理方法
有时我们需要查询大文本而不是数据库,这时就需要流式读入文件并实现查询算法,还要进行并行处理以提高性能。但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的并行处理。
使用免费的集算器可以弥补这一不足。集算器封装了丰富的结构化文件读写和游标计算函数,书写简单代码就能实现并行计算,并提供了易用的JDBC接口。JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果。
集算器与Java应用程序的集成结构如下:
下面举例说明集算器协助JAVA查询大文本的基本过程。源数据sOrder.txt如下:
要查询起止时间是startDate、endDate之间,金额大于argAmount的订单,只需使用如下代码:
A1:以游标方式打开文件。@t表示将第1行读为列名。
A2:进行结构化查询,结果为游标。
A3:执行游标,将结果读入内存,如下:
JAVA主程序可以JDBC的方式调用集算器脚本,代码如下:
Class.forName("com.esproc.jdbc.InternalDriver");
con=DriverManager.getConnection("jdbc:esproc:local://");
//调用集算器脚本(类似存储过程),其中searchbig是dfx的文件名
st=(com. esproc.jdbc.InternalCStatement)con.prepareCall("call searchbig");
//设置参数
st.setObject(1,"2010-01-01");
st.setObject(2,"2010-12-31");
st.setObject(3,2000);
//执行脚本
st.execute;
//获取结果集
ResultSetrs = st.getResultSet;
……
返回值是符合JDBC标准的ResultSet对象,调用集算器脚本和访问数据库的方法完全一样,熟悉JDBC的程序员可以很快掌握。
对于上面这类较简单的代码,还可以直接将脚本写在JDBC调用中,多行语句之间用\n分隔即可,类似执行一句较复杂的SQL,这样可以不必再保存一个脚本文件。
st = (com.esproc.jdbc.InternalCStatement)con.createStatement;
ResultSet rs1 =st.executeQuery("=file(\"D:\\sOrder.txt\").import@t\n" +"=A1.select(OrderDate>=date(\"2010-01-01\") &&OrderDate<=date(\"2010-12-31\") && Amount>2000)\n"+
"=A2.fetch");
集算器会返回最后一个表达式的值。
如果查询结果内存装不下,可以在集算器中直接返回游标(即去掉A3代码),在JAVA中只需设置每批次读取的记录数即可正常读取,具体代码如下:
st.setFetchSize(1000)
关于集算器JDBC的部署和调用的更详细信息可参考集算器集成应用之被JAVA调用。
集算器还可以实现多线程并行计算,最简单方法就是在上述代码的cursor函数中使用@m,这表示多线程读取文件。
也可以手工分段,在读取和计算部分都使用多线程并行计算,代码如下:
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。
来源:51CTO
Java查询大文本文件的处理方法相关推荐
- python切割txt文件_用Python实现大文本文件切割的方法
在实际工作中,有些场景下,因为产品既有功能限制,不支持特大文件的直接处理,需要把大文件进行切割处理. 当然可以通过UltraEdit编辑工具,或者从网上下载一些文件切割器之类的.但这些要么手工操作太麻 ...
- Java读写大文本文件(2GB以上)
如下的程序,将一个行数为fileLines的文本文件平均分为splitNum个小文本文件,其中换行符'r'是linux上的,windows的java换行符是'\r\n': package kddcup ...
- php查询mysql表里的数据_PHP/MYSQL 查询大数据/遍历表
PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50) MYSQL:5.1.51 如果我们有的一张表有几百万或几千万的记录,我们要使用 PHP 将所有的记录 ...
- 【MySQL Tips】偏移量大的分页查询LIMIT子句的优化方法
SQL优化是要看执行计划分析,并做基准测试的. 前言 MySQL官方关于LIMIT子句的优化建议在之前的文章中写过,链接如下: 8.2.19 LIMIT查询优化.note [MySQL 8翻译]8.2 ...
- JAVA实现服务器间拷贝文件,寻找在Java服务器之间传输大文件的好方法
在这个项目中有一个主要的数据库服务器,其他安装在不同地方的服务器维护着自己的本地数据库.我们必须允许每个系统将其本地数据库更新为主要数据库上的任何版本.所有的服务器都运行Java环境.寻找在Java服 ...
- C#使用linq查询大数据集的方法
这篇文章主要介绍了C#使用linq查询大数据集的方法,涉及C#调用linq进行数据查询的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 using System; using System.Coll ...
- java 下载加速_一种基于Java的大文件下载加速方法与流程
本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法. 背景技术: 现有的常用下载方式是基于浏览器的单线程下载.这种单线程下载的方式,是通过htt ...
- python大文本文件处理软件_Python文本处理之按行处理大文件的方法
python 文本处理,利用python脚本处理任意文件,取希望实现功能: $logprocessor.py 其中> love,w ./readit.p被爱的人不需千军万马,毫不费力,便占据一片 ...
- java获取dns_Java 根据网址查询DNS/IP地址的方法
说明: 本文不涉及底层的 DNS 协议, 直接使用Java平台提供的API进行操作. DNS也就是 Domain Name Service,即 域名服务. 我们知道, Java中与网址有关的类包括 j ...
最新文章
- linux终端 多标签,Linux有问必答:如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签...
- ecshop 删除订单时提示“以下订单无法被移除”的解决办法
- 《Effective-Ruby》读书笔记
- deploy.php
- 转:Java反射教程
- (7)FPGA面试技能提升篇(SD card)
- 第一个神经网络代码分享
- java虚拟机安装_java虚拟机官方下载|Java Virtual Machine(java虚拟机)下载v5.0官方版 附安装教程 - 欧普软件下载...
- linux 屏幕键盘onborde,电脑虚拟键盘模拟器|On-Screen Keyboard pro(电脑屏幕键盘软件)下载 V9.0.4 官方版 - 比克尔下载...
- jaxl php,php – jaxl无法连接到Prosody
- 多微博账号同时发微博的插件--fawave
- android 从app跳转到微信小程序和微信没有设置浮动权限 打不开小程序
- 线上展厅3d化宣传效果怎样 广州商迪
- GetDc与GetWindowDc的含义
- 荒野行动为什么不能获取服务器信息,荒野行动卡在获取服务器信息上了怎么办?(附解决方法)...
- 解决backtrack5连接不上ssh问题
- [转]python各模块的学习
- springBoot员工管理系统
- 【网络互联技术】(二) 网络安全的几种解决途径
- 12.4 jason格式
热门文章
- auve子表单中只读不好用
- spring配置datasource三种方式 数据库连接
- android 返回字符串,android – 如何从异步回调使用Retrofit返回String或JSONObject?
- 十个隐藏_LOL手游:新版增加42个英雄,大白兔:10个隐藏T0角色
- html 消息通知功能,HTML5之消息通知的使用(Web Notification)
- linux查找用户前三进程_查看 Linux 系统中进程和用户的内存使用情况 | Linux 中国...
- 2021年春季学期-信号与系统-第七次作业参考答案-第十小题
- 2021年春季学期-信号与系统-第七次作业参考答案-第八小题
- 人工神经网络-2020-第十四周-人工神经网络硬件实现-备课
- 广义互相关计算TDOA