以前と同じですが、条件は再掲します。
まず、sqlite3でテーブルを作ります。
sqlite> CREATE TABLE hash ( id INTEGER PRIMARY KEY , value TEXT );
insertするネタはcsvファイルで
1,356a192b7913b04c54574d18c28d46e6395428ab
2,da4b9237bacccdf19c0760cab7aec4a8359010b0
3,77de68daecd823babbb58edb1c8e14d7106e83bb
…
1列目は数字で2列目は数字のsha1値です。
これを100万行分用意します。(neta.csv)
次にsqlite3のJDBCを探します。複数ありそうですが、今回はココにあったやつをダウンロードしました。HP上の記載を見るとsqliteは3.6.14がベースとの事です。
次に以前作成したpostgresqlへのinsertするjavaアプリを適度にsqlite用に数行修正しました。変更点は以下、赤字です。
import java.sql.*;
import java.io.*;
import java.util.Date.*;
public class sqliteins {
public static void main (String args[]) {
Connection db = null;
PreparedStatement ps = null;
String sql = "insert into hash values(?,?)";
String url = "jdbc:sqlite:testdb";
BufferedReader br = null;
int i = 0;
try {
Class.forName("org.sqlite.JDBC");
db = DriverManager.getConnection(url);
db.setAutoCommit(false);
ps = db.prepareStatement(sql);
} catch (Exception ex) {
ex.printStackTrace();
}
java.util.Date d1 = new java.util.Date();
System.out.println(d1);
try{
br = new BufferedReader(new InputStreamReader(new FileInputStream("neta.csv")));
String line;
while( (line = br.readLine()) != null ){
i++;
String[] col = line.split(",");
int id = new Integer(col[0]);
String value = col[1];
ps.setInt(1,id);
ps.setString(2,value);
ps.executeUpdate();
if( i % 10000 == 0) {
System.out.println(i);
db.commit();
}
}
// データベース切断
db.commit();
ps.close();
db.close();
br.close();
} catch (Exception ex) {
ex.printStackTrace();
}
java.util.Date d2 = new java.util.Date();
System.out.println(d2);
}
}
import java.io.*;
import java.util.Date.*;
public class sqliteins {
public static void main (String args[]) {
Connection db = null;
PreparedStatement ps = null;
String sql = "insert into hash values(?,?)";
String url = "jdbc:sqlite:testdb";
BufferedReader br = null;
int i = 0;
try {
Class.forName("org.sqlite.JDBC");
db = DriverManager.getConnection(url);
db.setAutoCommit(false);
ps = db.prepareStatement(sql);
} catch (Exception ex) {
ex.printStackTrace();
}
java.util.Date d1 = new java.util.Date();
System.out.println(d1);
try{
br = new BufferedReader(new InputStreamReader(new FileInputStream("neta.csv")));
String line;
while( (line = br.readLine()) != null ){
i++;
String[] col = line.split(",");
int id = new Integer(col[0]);
String value = col[1];
ps.setInt(1,id);
ps.setString(2,value);
ps.executeUpdate();
if( i % 10000 == 0) {
System.out.println(i);
db.commit();
}
}
// データベース切断
db.commit();
ps.close();
db.close();
br.close();
} catch (Exception ex) {
ex.printStackTrace();
}
java.util.Date d2 = new java.util.Date();
System.out.println(d2);
}
}
CLASSPATHを通して実行します。
100万件のinsertの実行時間は39sでした。
因みに、
commitを10万回に1回にした場合→21s
commitを50万回に1回にした場合→19s
とさらに早くなりました。
全く同じコードでもPostgreSQLよりも断然早いです。そもそもPostgreSQLやその他DBMSとSqliteは用途が若干異なる為、比較する意味はあまり無いかもしれませんが、Sqliteはかなりいい感じ。。。ですね。
全く同じコードでもPostgreSQLよりも断然早いです。そもそもPostgreSQLやその他DBMSとSqliteは用途が若干異なる為、比較する意味はあまり無いかもしれませんが、Sqliteはかなりいい感じ。。。ですね。