- - 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
