※ 引述《penguin0322 (陸哥1/17記得共同101考本)》之銘言:
: 現在由於學校要用到
: 需要把一些很大的生物資料放進MySQL的資料庫中
: 而這也是我第一次用跟學java和MySQL 冏rz..
: >JCVI_SCAF_1101669000001 /length=1071 /full_length=1071
: /assembly=JCVI_ASM_feb03_2005_GS-02
: ATTCTTATTTATGATCTAGATGTGCATCAAGGTGATGGTACTGCGAAAATTTTTGAAAATAATGATCAGGTGTATACTTT
: ............(中間省略)
: GGATCCAGCATCAAACACTCTAGGCTGGAGATGGGTGGCAGGTCTTCATACCAAGGGGAAGCATTATCTAGCTTCCGAAT
: GGATATAATAAATCTCCGCTAAAAGTATGAG
: 我原本的想法是MySQL load data的時候是用\n\t來分隔資料
: 而我的資料不是格式都相同
: 所以原本打算用java來做資料的轉換
: JCVI_SCAF_1101669000000 length=840 full_length=840 assembly=JCVI_ASM_feb03_2005_GS-02
: AATACACCTTATGCAGATATCGCTTCTTCTAATTTTGCAAACAAAAGATTGAGTTCGTTTTATTTAGGCGGGATTA...
: 這樣資料就都是變成以tab和換行來表示了 MySQL也就可以作輸入的動作了
: 但是 以上都是我用一個小數據測試的結果
: 當我要實作時 我的資料是4.5GB...冏rz
: 跑了三四個小時 最後出現
: java.lang.OutOfMemoryError 冏..
可以簡單的跟您提一下, 通常要用java 對這種很大的檔案做存取,
一般是以二元碼串流進行讀入及輸出..
簡單範例 : 若您要從檔案讀取, 再寫入檔案---
public static void main(String[] arg0) {
File fromFile = new File("c:\\source.txt");
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream(fromFile));
BufferedOutputStream bos = new BufferedOutputStream (
new FileOutputStream("c:\\to.txt"));
byte[] buffer = new byte[4096];
int n = -1;
while((n=bis.read(buffer))!=-1) {
bos.write(buffer, 0, n);
}
bos.flush();
bis.close();
bos.close();
}
byte陣列 buffer 的大小可以自己調. 那是串流緩衝區塊的大小.
如果是資料庫 您可能就要把它存到 Clob或Blob欄位了.
但各家的資料庫對這兩種資料型態有不一樣的實作......
Mysql的話, 我記得 Clob或Blob 有限制 32mb還是64mb.
但後來的版本好像有做比較大的資料型態. 這一方面您可能要去看一下Mysql的文件.
資料太大存不進資料庫會跟其 欄位的資料型態或資料表本身的資料限制有點關係.
如果是要用java存進資料庫. 您可以看一下 java.sql 底下的PreparedStatement的用
法. 您可能會發現, 其實最直覺的應該是要把資料 存成 java的Blob或 Clob的物件.
再把它寫到資料庫. 但是 java卻沒有提供直接建立 Blob及Clob物件的方法.
反而是要從資料庫去讀取, 才有辦法取得這兩個的物件.
唯一比較快,而且比較正確的做法也是使用二位元串流存取..
你會發現PreparedStatement類別中有一個 setBinaryStream 這個方法可以用.
其中第三個參數, 你可以用InputStream的available來取得... 希望對您有幫助.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.160.124.20