- - PR -
大きいファイルをSQLで読み込む方法
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-25 16:48
題名どおりの処理を行おうと思うんですが、
データが途中で切り捨てられてしまいます。 データは最大500字ほどの文字列で、データが大量にあります。 それをCSVファイルからJDBC-ODBCブリッジ使って、 TextDriver経由でSQL使って取り込んでいます。 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con=DriverManager.getConnection("jdbc:odbc:テキストドライバのDSN"); stmt=con.createStatement(); rs=stmt.executeQuery(sql); という風に記述をしています。 解決策としてStatementのフィールド最大幅を変える(setMaxFieldSizeメソッド)方法があるみたいなんですが、デキストドライバじゃ使えない?みたいなことがエラーとしてでました。 どうすれば、CSVファイルから大きいサイズのデータを読み込めることができるでしょうか。 | ||||||||
|
投稿日時: 2007-05-25 17:10
FileInputStream で読み込むのはいかがでしょう?
| ||||||||
|
投稿日時: 2007-05-25 17:14
返答ありがとうございます。
ご指摘の件ですが、処理するデータの量が何千件と多いものでして、 FileInputStreamを使うと処理がとてつもなく重くなってしまいます。 一部だけFileInputStream使うって手もあるとは思うんですが・・・・ | ||||||||
|
投稿日時: 2007-05-25 17:53
JDBC-ODBC+TextDriverがFileInputStreamを直接扱うより速いなんて ありえないと思います。作りがあまりにもアレなら別ですけど。 どうしてもSQLで処理しなければならない理由があるんですか? | ||||||||
|
投稿日時: 2007-05-25 18:01
どうしてもSQLを使わなきゃいけないってことは無いんですが、
表をCSVから列指定で取り込んで第1第2第3優先キーを使ってソートも行わなければいけないので、SQLの方が勝手が良いんです。 問題は、ファイルの中に大きな列要素が混じってるということなんです。 列要素が単体だけなら、いくらでもやりようがあるんですが、どうでしょうか? | ||||||||
|
投稿日時: 2007-05-25 18:19
>>インギさん、あしゅさん
すみません。FileInputStreamをFileReaderと間違えてました。 FileInputStreamは、表の特定の列要素を読み込むということができるんでしょうか? | ||||||||
|
投稿日時: 2007-05-25 18:40
どちらも大差ないです。 単にバイト指向か文字指向かの違いで。 テキストを読む場合は最終的には暗黙的にしろ明示的にしろ 普通はどこかしらでInputStreamReaderを使う事になります。
ソートもCSV上で行わなければいけない理由が見えませんが、 HSQLDBがCSVを扱えた気がするので試してみるとよいかもしれません。 軽いので一時的なデータベースとして使うのもいいでしょう。 自力でやるなら、 CSVを二回読み込む事になりますが、 1. ソートキーをCSVから読み込み、ファイル上の位置も記録する 2. メモリ上でソートキーを使ってソートする 3. ソートされた順序でシークしながら全データを読み込む という方法が速いんじゃないでしょうか。 この場合は、2パス目でシークが必須になるのでReaderは使えません。 文字エンコーディングを無視してInputStreamから行単位で読み込み、 読み込み後の行単位でのエンコーディング変換が必要になります。 数千件程度ならソートに使うデータくらいはオンメモリで十分でしょう。 | ||||||||
|
投稿日時: 2007-05-28 09:15
数日ネットに繋げない場所に居たので、返信(というか、お礼)が返せませんでした。
>>あしゅさん お礼が遅くなってすみません。 CSVファイルも中間表なので、別に他のデータベースを使っても大丈夫なんですが、 それでも文章が途中で途切れてしまうもので・・・。 とりあえず、ソートするキーだけSQLで作って、あとはFileInputStreamでシークしながら読み込んで書き出す、という方法でやってみたいと思います。 詳しい説明をありがとうございました。 |
1