我有几个目录,每个目录包含大约10,000个文件。我想读取文件并将数据写入数据库中的特定列。我遇到的问题是速度。我正在使用preg_replace_callback
将多个正则表达式存储在数组中。
如果可能的话,我需要帮助弄清楚如何将正则表达式压缩成单个表达式,或者找到一种在没有正则表达式的情况下实现相同目标的更好方法。
每个数据文件都是这样的,只是更大:
Company: Google, Since: 1998
Longitude: 37.422, Latitude: 122.084
Email: google@gmail.com
...
我将使用以下代码来演示性能:
class DataParser
{
public $data;
public $regexes;
function __construct()
{
$this->regexes = array(
'company_since' => '/Company: ([a-z_]+), Since: ([0-9]+)/i',
'longit_latit' => '/Longitude: ([0-9.]+), Latitude: ([0-9.]+)/',
'email' => '/Email: ([a-z0-9_\-.]+)@([a-z0-9_\-.]+)/i'
);
}
function parse($data)
{
static $key = 0;
foreach ($this->regexes as $name => $regex) {
preg_replace_callback($regex, function($str) use($name, $key)
{
$this->data[$key][$name] = array($str[1], $str[2]);
}, $data);
}
$key++;
}
}
// This is normally in a file
$data = 'Company: Google, Since: 1998' . PHP_EOL
. 'Longitude: 37.422, Latitude: 122.084' . PHP_EOL
. 'Email: google@gmail.com';
$exec_start = microtime(true);
$parser = new DataParser();
for ($i = 0; $i < 10000; $i++) {
$parser->parse($data);
}
echo round(microtime(true) - $exec_start, 5), '/s';
echo '<pre>', print_r($parser->data, true), '</pre>';
输出结果为:
0.13795/s
Array
(
[0] => Array
(
[company_since] => Array
(
[0] => Google
[1] => 1998
)
[longit_latit] => Array
(
[0] => 37.422
[1] => 122.084
)
[email] => Array
(
[0] => google
[1] => gmail.com
)
)
[1] => Array
(
[company_since] => Array
(
[0] => Google
[1] => 1998
)
...
每个添加的正则表达式脚本越来越慢,但只有一个正则表达式表现良好。也许我在问错误的问题或试图解决错误的问题,在这种情况下:有什么更好的方法可以做到这一点?