首先推荐一个开源跨平台的SQLite图形化管理工具SQLiteStudio:
http://sqlitestudio.pl
用SQLiteStudio建5张等价于你Oracle里的那5张数据表.然后在CLI下用PHP的oci8扩展函数SELECT读取整张表数据,然后用PDO_SQLite开启事务,批量插入数据到SQLite数据库中.
注意CLI下运行的PHP脚本也是有内存限制(memory_limit)的,php.ini中设为-1,则表示不限制内存占用:
http://php.net/manual/zh/ini.core.php#ini.memory-limit
还有,保证你的机器内存能容纳20W数据(不算多),PHP7的数组更省内存,你也可以尝试使用PHP7进行操作,PHP7已经发布预览版RC1.CLI下操作完后不用的变量和数组记得unset释放掉内存.
$table = 'CREATE TABLE logs (
id INTEGER PRIMARY KEY,
date VARCHAR(19) NOT NULL,
content VARCHAR(200) NOT NULL
)';
if (!file_exists('data.db3')) {
$dbh = new PDO('sqlite:data.db3');
$dbh->query($table);
} else {
$dbh = new PDO('sqlite:data.db3');
}
$date = date('Y-m-d H:i:s');
$content = time();
$dbh->beginTransaction();
for($i=0;$i<1000000;$i++) {
$stmt = $dbh->prepare('INSERT INTO logs (date, content) VALUES (:date, :content)');
$stmt->bindParam(':date', $date, PDO::PARAM_STR, 19);
$stmt->bindParam(':content', $content, PDO::PARAM_STR, 200);
$stmt->execute();
}
$dbh->commit();
$dbh = null;
Ubuntu(i5-3230M),开启事务时,PHP往SQLite插入100万条记录只用16秒,平均每秒插入62500条.期间会产生一个临时文件data.db3-journal,该文件主要用于SQLite事务回滚,在事务开始时产生,在事务结束时删除.当程序发生崩溃或者系统断电时该文件将留在磁盘上,以便下次程序运行时进行事务回滚.因为会在当前目录下产生临时文件data.db3-journal,所以需要保证PHP具有对该目录的写权限.