我的速度与内存使用有问题。
我有一个需要能够快速运行的脚本。它只是从1-100MB加载多个文件,由一系列值组成,并检查其中有多少文件存在于另一个列表中。
我这样做的首选方法是将文件中的值加载到数组(explode
)中,然后遍历此数组并使用isset
检查值是否存在。< / p>
我遇到的问题是有太多的值,它耗尽了大约10GB的内存(我不知道为什么会这么用)。所以我一直在将文件中的值加载到内存中,而不是仅仅爆炸整个文件。这会减少内存使用量,但速度非常慢。
有更好的方法吗?
代码示例:
$check=array('lots','of','values','here');
$check=array_flip($check);
$values=explode('|',file_get_contents('bigfile.txt'));
$matches=0;
foreach($values as $key)
if (isset($check[$key])) $matches++;
答案 0 :(得分:2)
也许您可以编写自己的PHP C扩展(请参阅例如this question),或者在C中编写一个小实用程序并让PHP运行它(可能使用popen
)?
答案 1 :(得分:1)
这些似乎是某种形式的面向键/值的NoSQL数据存储(mongodb,couchdb,Riak)的经典解决方案(或者甚至可能只是一个大型的memcache实例)。
假设您可以在需要进行搜索之前将大数据文件加载到数据存储区中,并且您将多次使用加载文件中的数据,您应该会看到一些令人印象深刻的收益(只要您的查询,mapreduce等并不可怕),根据您的数据大小判断,您可能希望查看数据存储,而不需要将内存中的所有内容保存为快速。
上面提到的每个数据存储都有很多PHP驱动程序(和教程)。
答案 2 :(得分:-1)
打开文件并按行阅读。也许使用MySQL,导入(LOAD DATA INFILE),得到数据或两者兼而有之。
答案 3 :(得分:-1)
看来你需要一些改进的搜索引擎。
Sphinx搜索服务器可用于快速搜索您的值。