只是寻找从Perl到PHP的转换的一点帮助。我利用哈希将值映射为从两个文件读入的两个数组的键。我使用的文件不是很大,一个大约150,000行,另一个大约50,000。在Perl中,这大约在10秒钟内运行,但在PHP中,我将读取文件从150,000行减少到大约20,000行,这需要将近3分钟。我想知道这是否是语言的限制,或者我的设计本质上是否存在缺陷。
两个现有的数组数组是$ ao_hash和$ string_hash,构建如下:
// Load file contents
$file_contents = str_replace("\t","|",file_get_contents($_FILES['file']['tmp_name']));
$file_array = explode("\n",$file_contents);
// Pass client dictionary into an array of arrays
foreach ($file_array as $line) {
$line_array = explode("|",$line);
if (stripos($line_array[0], 'mnemonic') !== false) {
continue;
}
if (!isset($line_array[1])) {
continue;
}
if (stripos($line_array[1], 'n') !== false) {
continue;
}
if (!isset($line_array[10])) {
continue;
}
$ao_hash[$line_array[10]] = $line;
}
这两个哈希都是使用这种方法构建的,两者都运行良好(预期结果,快速执行)。它读起来像这样:
$array1[NDC] = some|delimited|file|output
$array2[NDC] = another|file|with|delimited|output
我使用NDC作为交叉映射两个数组的主键。
// Compare the client's drug report against the cut-down file
while (list ($key, $value) = each ($ao_hash)) {
// Use the NDC to match across array of arrays
if (isset($string_hash[substr($key,0,11)])) {
$string_selector = $string_hash[substr($key,0,11)];
}
// Check if the client NDC entry exists in cut-down file
if (!isset($string_selector)) {
// No direct NDC match, reserve for an FSV look-up
$ao_array = explode("|", $value);
if (isset($ao_array[2]) && isset($ao_array[16])) {
$no_matches[$ao_array[2].'|'.$ao_array[16]]['NDC'] = $ao_array[10];
$no_matches[$ao_array[2].'|'.$ao_array[16]]['MNEMONIC'] = $ao_array[0];
}
} else {
// Direct match found
$ao_array = explode("|", $value);
$cutdown_array = explode("|", $value);
foreach ($cutdown_array as $cutdown_col) {
if ($cutdown_col == "") {
$cutdown_col = "0";
}
$cutdown_verified[] = $cutdown_col;
}
// Drop the last column
array_pop($cutdown_verified);
// Merge into a single string
$final_string = implode("|", $cutdown_verified);
// Prepare data for FSV match
if (isset($ao_array[2]) && isset($ao_array[16])) {
$yes_matches[$ao_array[2].'|'.$ao_array[16]]['DRUG_STRING'] = $final_string;
}
// Add the mnemonic to the end
$final_string .= '|'.$ao_array[0];
$drug_map[$ao_array[0]] = $final_string;
}
}
任何帮助都会很棒,只是想这样跑得更快。
答案 0 :(得分:1)
Redditor https://www.reddit.com/user/the_alias_of_andrea解决了这个问题:
而不是使用:
while (list($key, $value) = each($ao_hash))
使用
效率更高foreach ($ao_hash as $key => $value)
现在立即执行13MB文件,我得到了预期的结果。