首先推荐一个开源跨平台的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释放掉内存. <?php $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具有对该目录的写权限.
首先推荐一个开源跨平台的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释放掉内存.
Ubuntu(i5-3230M),开启事务时,PHP往SQLite插入100万条记录只用16秒,平均每秒插入62500条.期间会产生一个临时文件data.db3-journal,该文件主要用于SQLite事务回滚,在事务开始时产生,在事务结束时删除.当程序发生崩溃或者系统断电时该文件将留在磁盘上,以便下次程序运行时进行事务回滚.因为会在当前目录下产生临时文件data.db3-journal,所以需要保证PHP具有对该目录的写权限.