作者sirII (爪哇我的生活~)
看板java
标题Re: [问题] 用java处理巨大文件
时间Sat Jul 21 12:15:20 2007
※ 引述《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