2015-04-21 16 views
2

我有一个脚本,它读取一个带有3mb数据的文本文件并编写一个.sql文件来导入。为什么apache2服务器需要长达1.5小时才能写出一个6 MB的.sql文件

此文本文件正在上传到第三方的应用程序,每隔1小时尽管一天。

问题是这个脚本在我的本地PC中完成少于1分钟。但是当脚本在生产服务器上运行(这是4GB RAM,2核处理器的专用服务器)需要高达1.5小时小时。此脚本用于在相同环境下运行5分钟以下。

的文本文件ziped成.gz文件解所以我用gzopen到oepn通过文件的文件和fgets循环,并创建一个SQL字符串写入到一个.sql文件(以下是创造出来的字符串文本文件)

'INSERT INTO `table` (`col_1`,`col_2`,`col_3`,`col_4`,`col_5`,`col_6`,`col_7`,`col_8`,`col_9`,`col_10`,`col_11`,`col_12`,`col_13`,`col_14`,`col_15`,`col_16`) 
VALUES 
("'.implode('","', 
    array(
    mysqli_real_escape_string($this->ds,$trackNo), 
    mysqli_real_escape_string($this->ds,$ln[1]), 
    $dateReceived, 
    mysqli_real_escape_string($this->ds,$ln[2]), 
    $dateDelevered, 
    mysqli_real_escape_string($this->ds,$ln[3]), 
    mysqli_real_escape_string($this->ds,$ln[4]), 
    mysqli_real_escape_string($this->ds,$ln[5]), 
    mysqli_real_escape_string($this->ds,$ln[7]), 
    mysqli_real_escape_string($this->ds,$ln[8]), 
    mysqli_real_escape_string($this->ds,$ln[9]), 
    date(DATE_ISO8601,time()), 
    date(DATE_ISO8601,time()), 
    'system', 
    mysqli_real_escape_string($this->ds,$ln[4]), 
    'txt.gz')) 
.'");' 

这个字符串将由线写入.sql文件行中使用fwrite

fgets结束我不明白为什么这个过程需要这么长的时间,因为在我之前电脑完成2分钟以下

+0

在某些日志文件或控制台的不同步骤中记录时间以知道哪一步花费了大量时间,读取,内爆,写入或其他内容 –

+0

感谢您的快速回复。我会这样做,并带来结果。 – Tharindu

+0

客观地看待问题,你可以做一些[规范化](http://en.wikipedia.org/wiki/Database_normalization)。备份你的数据库会更快。查看增量/部分备份解决方案也可能是一个好主意。 – psycotik

回答

0

您可能有默认的innodb_flush_log_at_trx_commit = 1; = 2的运行速度会明显加快,因为每次插入后都不会刷新。

另一种方法是'批'INSERTs。建筑物INSERT ... VALUES (...), (...), ...将运行速度提高10倍。我建议批量为100到1000.

按今天的标准,1GB的RAM很小。我希望你没有innodb_buffer_pool_size大于100M。太大的buffer_pool可能会导致交换,这对性能来说真的很糟糕。

+0

发现问题,有架构的问题。一列已经改变为以前是KEY的UNIQUE KEY,这样就有了额外的时间来进行验证。无论如何,感谢您指出我可以用来加速我的脚本的这些更改,我将执行这些更改。我错误的RAM有4 GB的内存。感谢您的回答我真的很感激它:-) – Tharindu

+0

1500M对于4GB机器中的buffer_pool可能是合理的。 –

相关问题