我正在开展一个小项目,我需要一些帮助。我有一个包含150,000行的CSV文件(每行有10列数据)。我正在使用fscvread来读取文件,并且在循环期间我希望将每行的一个列(称为stringx)与10,000个单词的数组进行匹配。如果stringx中存在10,000个单词中的任何一个,则使用preg_replace删除它。
现在所有这一切都很好。我的一切工作正常,但问题是,它太慢了。
我尝试了两种匹配数组的方法。 1)我使用explode(“”,$ stringx)将stringx转换为数组,然后使用array_diff($ array_stringx,$ array_10000); 2)在$ arrayx100上使用foreach,在$ stringx上使用preg_replace
方法1需要大约60秒才能完成200行数据,方法2可以在60秒内循环500行。
有更好的方法吗?
再次,我正在寻找一种有效的方法(基本上)array_diff一个10,000字的数组,一次一个150,000字符串。
非常感谢帮助。
答案 0 :(得分:2)
以下只是另一种选择。它可能会也可能不会满足您的要求。
它在我的笔记本电脑上执行84次操作/秒,10k字词典和15k字符串。
缺点是它不会删除单词周围的空格。
$dict = array_flip(preg_split('/\n/',$wordlist));
function filter($str,$dict) {
$words = preg_split('/\s/',$str);
sort($words);
$words = array_unique($words);
foreach ($words as $word) {
if (key_exists($word,$dict)) {
$removeWords[] = '/\b' . $word . '\b/';
}
}
return preg_replace($removeWords, '', $str);
}
另一个执行速度更快的例子(107k / s,15kb字符串和10k字字典)
function filter2($str,$dict) {
$words = preg_split('/\b/',$str);
foreach ($words as $k => $word) {
if (key_exists($word,$dict)) {
unset($words[$k]);
}
}
return implode('', $words);
}
答案 1 :(得分:1)
您的10000字数组是否排序?如果没有,请先尝试排序。
编辑:好吧,因为它的排序我猜测也许PHP的array_search不进行二进制搜索,所以我会寻找二进制搜索实现并使用它。如果它确实只是一个线性搜索,那么你将获得一个数量级的速度增加。
答案 2 :(得分:1)
PHP不是速度的语言,但我猜你知道。我必须在我正在编写的项目中做类似的事情,我正在用PHP编写一个文件,然后使用Matlab独立来读取该文件,处理它并输出另一个文件。
您也可以这样做并在C中编写一个与array_diff()
相同的小程序。我认为虽然我没有做过任何测试,但会有很大的不同。
答案 3 :(得分:1)
如何不爆炸stringx,并为$ array_10000中的每个单词执行stripos()?
像这样:foreach ($array_10000 as $word)
{
if (stripos($stringx, $word) !== false)
{
// do your stuff
}
}
答案 4 :(得分:0)
我没有对此进行测试,但它只是发生在我身上:
您可以尝试使用正则表达式预解析文件以获取要过滤的150,000个单词(基于列分隔符),然后您可以执行文本替换,根据this article I googled选择最佳函数。 / p>
我希望它有所帮助!干杯!
答案 5 :(得分:0)
您可以执行foreach
以及implode
。
$words = array("one","two", "three");
$number = 0;
foreach ($words as $false_array)
{
$number += 1;
$array[$number] = $false_array;
echo "Added ". $false_array . ". ";
}
foreach ($words as $false_array)
{
echo "Array Contains " . $false_array . ". ";
}
如果您要在php中执行此操作,您将获得:
Added one. Added two. Added three. Array Contains one. Array Contains two. Array Contains three.