"[SQL Server] JDBCによるtext、ntext、imageの操作方法(その2)"で触れたように、Javaからtext、ntext、image型のデータを読み込む場合、getCharacterStream()メソッドやsetBinaryStream()メソッドといった入出力ストリームを利用すれば効率よく読み込めますが、この時、読み込みバッファサイズをどれくらいに設定するのがいいのでしょうか?
以下のようなimage型のデータを入出力ストリームを使ってファイルに出力するプログラム(一部抜粋)で
FileOutputStream fos = new FileOutputStream( new File( "C:\TEST.JPG" ) );
PreparedStatement pstmt
= con.prepareStatement( "SELECT IMAGE_VALUE FROM TABLEA WHERE ID = ? " );
pstmt.setInt( 1, 1 );
rs = stmt.executeQuery();
if( rs.next() ){
InputStream ins = rs.getBinaryStream( 1 );
byte[] buffer = new byte[ バッファサイズ ];
int length = -1;
while( ( length = ins.read( buffer , 0 , バッファサイズ ) ) != -1 ) {
fos.write( buffer , 0 , length );
}
ins.close();
}
fos.close();
読み込みバッファサイズを1KB~64KBまで倍々に増やしながら、140MBのファイルの読み込みに要する時間を測定してみると以下のような結果が得られました。
(5回計測しての平均値)
| 読み込みバッファサイズ(KB) | 総読み込み時間(秒) |
|---|---|
| 1 | 23.76 |
| 2 | 22.23 |
| 4 | 23.26 |
| 8 | 6.71 |
| 16 | 4.75 |
| 32 | 4.43 |
| 65 | 4.33 |
ご覧の通り、4KBまでは22~23秒でほぼ変わらずですが、8KBから急激にパフォーマンスが向上します。
SQL Serverの場合、ページサイズは8KB、エクステントサイズは64KBとなっており、この単位でI/Oが行われます。
そのため、text、ntext、image型のデータの読み込みバッファサイズもページサイズ(8KB)の倍数とするのがよいようです。
【関連エントリ】
[SQL Server] JDBCによるtext、ntext、imageの操作方法(その1) 2005/03/02
[SQL Server] JDBCによるtext、ntext、imageの操作方法(その2) 2005/03/03
[SQL Server] text型やimage型を読み込む際の最適なバッファサイズは? 2005/03/09
[SQL Server] imageデータをファイルから直接登録する方法 2005/03/15
[SQL Server] BULK INSERTステートメントによるデータのアップロード 2005/03/16
[SQL Server] imageデータをファイルに直接出力する。2005/03/17
[SQL Server] image型やtext型はテキストポインタを利用して取得したほうが速い 2005/08/04