- PR -

大きいファイルをSQLで読み込む方法

1
投稿者投稿内容
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 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ファイルから大きいサイズのデータを読み込めることができるでしょうか。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-05-25 17:10
FileInputStream で読み込むのはいかがでしょう?
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 2007-05-25 17:14
返答ありがとうございます。

ご指摘の件ですが、処理するデータの量が何千件と多いものでして、
FileInputStreamを使うと処理がとてつもなく重くなってしまいます。

一部だけFileInputStream使うって手もあるとは思うんですが・・・・
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-05-25 17:53
引用:

キューティーB☆O☆Nさんの書き込み (2007-05-25 17:14) より:
ご指摘の件ですが、処理するデータの量が何千件と多いものでして、
FileInputStreamを使うと処理がとてつもなく重くなってしまいます。


JDBC-ODBC+TextDriverがFileInputStreamを直接扱うより速いなんて
ありえないと思います。作りがあまりにもアレなら別ですけど。

どうしてもSQLで処理しなければならない理由があるんですか?
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 2007-05-25 18:01
どうしてもSQLを使わなきゃいけないってことは無いんですが、
表をCSVから列指定で取り込んで第1第2第3優先キーを使ってソートも行わなければいけないので、SQLの方が勝手が良いんです。

問題は、ファイルの中に大きな列要素が混じってるということなんです。

列要素が単体だけなら、いくらでもやりようがあるんですが、どうでしょうか?
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 2007-05-25 18:19
>>インギさん、あしゅさん
すみません。FileInputStreamをFileReaderと間違えてました。

FileInputStreamは、表の特定の列要素を読み込むということができるんでしょうか?
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-05-25 18:40
引用:

キューティーB☆O☆Nさんの書き込み (2007-05-25 18:19) より:
FileInputStreamは、表の特定の列要素を読み込むということができるんでしょうか?


どちらも大差ないです。
単にバイト指向か文字指向かの違いで。

テキストを読む場合は最終的には暗黙的にしろ明示的にしろ
普通はどこかしらでInputStreamReaderを使う事になります。

引用:

どうしてもSQLを使わなきゃいけないってことは無いんですが、
表をCSVから列指定で取り込んで第1第2第3優先キーを使ってソートも行わなければいけないので、SQLの方が勝手が良いんです。



ソートもCSV上で行わなければいけない理由が見えませんが、
HSQLDBがCSVを扱えた気がするので試してみるとよいかもしれません。
軽いので一時的なデータベースとして使うのもいいでしょう。

自力でやるなら、

CSVを二回読み込む事になりますが、
1. ソートキーをCSVから読み込み、ファイル上の位置も記録する
2. メモリ上でソートキーを使ってソートする
3. ソートされた順序でシークしながら全データを読み込む

という方法が速いんじゃないでしょうか。

この場合は、2パス目でシークが必須になるのでReaderは使えません。
文字エンコーディングを無視してInputStreamから行単位で読み込み、
読み込み後の行単位でのエンコーディング変換が必要になります。

数千件程度ならソートに使うデータくらいはオンメモリで十分でしょう。
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 2007-05-28 09:15
数日ネットに繋げない場所に居たので、返信(というか、お礼)が返せませんでした。

>>あしゅさん
お礼が遅くなってすみません。
CSVファイルも中間表なので、別に他のデータベースを使っても大丈夫なんですが、
それでも文章が途中で途切れてしまうもので・・・。

とりあえず、ソートするキーだけSQLで作って、あとはFileInputStreamでシークしながら読み込んで書き出す、という方法でやってみたいと思います。

詳しい説明をありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)