成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java查詢大文本文件的處理方法

開發 后端
有時我們需要查詢大文本而不是數據庫,這時就需要流式讀入文件并實現查詢算法,還要進行并行處理以提高性能。但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。

責任編輯:王雪燕 來源: 紅黑聯盟
相關推薦

2009-08-06 18:33:45

C#處理文本文件

2009-09-02 19:13:08

C#處理文本文件

2010-04-30 17:38:31

Unix文本

2021-11-29 09:46:11

FileReaderJava開發

2009-08-12 17:59:48

C#讀取文本文

2009-09-04 15:56:35

寫入文本文件

2010-01-08 16:10:05

VB.NET讀寫文本文

2021-12-06 07:15:48

類方法類讀取文本

2010-01-15 10:05:35

VB.NET文件對象

2009-08-26 11:53:56

C#打印文本文件

2009-09-02 19:08:03

C#實現讀取文本文件

2010-05-13 17:43:43

IIS服務器

2014-02-12 14:45:40

Linux文本文件

2014-03-11 10:11:33

Linux命令more命令文本文件

2010-02-01 14:26:50

C++讀寫文本文件

2009-08-19 17:44:15

C#操作文本文件

2009-08-20 09:15:20

C#操作文本文件

2023-03-31 23:31:06

.go文本文件

2009-08-20 10:17:27

C#操作文本文件

2022-09-29 10:01:05

Go編程語言文本文件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色免费在线观看网址 | 91在线观| 美日韩免费视频 | 日本三级电影免费观看 | 久久69精品久久久久久久电影好 | 麻豆av网站 | 99精品视频一区二区三区 | 日韩a视频 | 日韩午夜影院 | 欧美久 | www.99re| 91在线资源 | 国产成人精品一区二区三区在线 | 欧美精品一区二区三区在线 | 亚洲精品高清视频在线观看 | 九九综合 | 在线视频中文字幕 | 国产精品免费大片 | 亚洲自拍偷拍视频 | 毛片日韩 | 毛片1| 99精品视频网 | 日韩一区二区在线视频 | 日本不卡免费新一二三区 | 国产91丝袜在线熟 | 国产高清视频 | 国产一区二区三区视频免费观看 | 国产综合久久久久久鬼色 | 一区二区三区四区国产 | 99久久婷婷国产综合精品首页 | 国产成人精品免高潮在线观看 | 91色视频在线观看 | 午夜免费精品视频 | 亚洲成人免费电影 | 国产高清在线观看 | 97国产精品视频人人做人人爱 | 日韩欧美视频 | 久久精品小视频 | 九色 在线 | 91五月天 | 精品1区|