您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Java中怎么處理大文本文件,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
集算器與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。
看完上述內容,你們對Java中怎么處理大文本文件有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。