用于优化加载CSV数据的PHP脚本

时间:2017-09-25 15:28:17

标签: php algorithm csv optimization

我的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);

1 个答案:

答案 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。