我的PHP脚本看起来像这样,它工作,它模拟就像是从SQL查询加入,但它没有优化,一切都加载到RAM中,有人可以帮助我如何优化和加载RAM只需要的行和来自其他CSV的列,基于第一个CSV文件“join”的左侧?此外,如果它能够模拟WHERE子句,那么它应该查看更少的数据,是吗?
<Level>1</Level>
我的a.csv文件如下所示:
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
我的c.csv文件如下所示:
<pre>
<?php
ini_set('memory_limit', '1024M');
$city = array_map('str_getcsv', file('a.csv'));
$table = array_map('str_getcsv', file('c.csv'));
function left_join_array($left, $right, $left_join_on, $right_join_on){
$final= array();
foreach($left AS $k => $v){
$final[$k] = $v;
foreach($right AS $kk => $vv){
if($v[$left_join_on] == $vv[$right_join_on]){
foreach($vv AS $key => $val)
$final[$k][$key] = $val;
}
}
}
return $final;
}
$new_table = left_join_array($table, $city, 4, 0);
print_r($new_table);
答案 0 :(得分:0)
永远不要在你的ram中加载大文件。你认为一个好主意总是会成为一个坏主意。您可以做的第一个优化是为$ table使用生成器,例如:
function getTable($file) {
$h = fopen($file, "r");
while (($line = fgets($h)) !== false) {
yield str_getcsv($line);
}
fclose($h);
}
第二个你的left_join_array函数是一个问题,它的速度是O(n^3)
,非常慢,而且就你的记忆而言,你也分配了大量的东西,但我和#39 ;在我们讨论如何优化数据之前,我需要更多关于您尝试处理数据的信息。
编辑:根据您的评论,我的编辑答案。
MySQL总是比几分钟内你能写的任何东西都要快,特别是如果你对RDBMS的运作方式一无所知。您可以根据需要模拟它,但MySQL应该至少快一个数量级; MySQL的连接算法是O((n*m) log(n*m))
,你的算法指数慢(字面上)。
如果这只是为了学习编码或其他目的的测试,那么你可以做的最好的就是你应该只使用上面的生成器函数来表示$ city和$ table。