【发布时间】:2015-10-26 23:28:54
【问题描述】:
我有一个巨大的文件,其中有几行数据(长度几乎相同)。我想浏览它们并找到某个单词的每一次出现,然后取出该单词出现的整行并将其回显到屏幕上。目前我正在使用这种方法:
$result_counter = 0;
$result_array[1] = 'No results';
$search_slug = $request->input('search_slug');
$fp = fopen(base_path('storage\app\xas.txt'), "r");
while (false !== ($line = fgets($fp))) {
// Process $line, e.g split it into values since it is CSV.
$exploded = explode('-', $line);
$exploded = implode('', $exploded);
set_time_limit(30);
if(strpos($exploded, strtoupper($search_slug))) {
$result_counter++;
$result_array[$result_counter] = $exploded;
}
}
return view('results')->with(array('results' => $result_array, 'query' => $search_slug));
fclose($fp);
逐行浏览一个巨大的文件需要很长时间。
您可能会问 - 为什么不使用 MySQL?
这是一个很大的问题 - 我的文件有 250 万行长,而且很快可能会更大。如果我尝试一次更新数据库,我的服务器的所有者将禁止我的帐户,更不用说人们将每小时查询大部分内容的事实。我也买不起“无限制”服务器。我会尽快迁移到 MySQL,但现在我需要一个快速的解决方案。
如何使用 PHP 解决这个问题?有没有办法在文件中搜索单词出现然后只抓取这些行?
【问题讨论】:
-
我会使用一个实际的可搜索索引,如 Lucene(或任何现代等价物)。这里有一些提示~stackoverflow.com/questions/2010663/lucene-with-php
-
可能是对
grep的系统调用? -
“如果我尝试一次性更新数据库,我的服务器所有者将禁止我的帐户,更不用说人们会每小时查询大部分内容。”据推测,如果您要切换到数据库,您应该只需要更新数据库一次,然后only从那里使用数据库。如果您正确地组织和索引您的表,您的查询应该只需几毫秒即可执行。
-
没关系,彼得,我们都必须从某个地方开始!我个人使用Vultr,但您有多种选择,例如Digital Ocean。这样,您可以随着数据库的增长简单地扩展您的解决方案!但正如@Mike 再次所说,如果索引正确,您的查询应该需要几毫秒。 (使用 VPS 可以让您成为“所有者”,因此您可以规避由此产生的任何问题)
-
其他人所说的:正确地
indexed表可能需要几毫秒才能更新。在我来到这里之前,我在不到 10 秒的时间内完成了一个包含 15+ 百万行的表的更新;x