Самый быстрый способ прочитать CSV-файл - PullRequest
7 голосов
/ 10 октября 2011

Я ищу очень быстрый способ чтения файла CSV.Моя структура данных выглядит следующим образом:

timestamp ,float     , string    ,ip          ,string
1318190061,1640851625, lore ipsum,84.169.42.48,appname

, и я использую fgetcsv для чтения этих данных в массивы.

Проблема: производительность.Регулярно сценарий должен читать (и обрабатывать) более 10000 записей.

Моя первая попытка очень проста:

//Performance: 0,141 seconds / 13.5 MB

while(!feof($statisticsfile)) 
    {
    $temp = fgetcsv($statisticsfile);
    $timestamp[] = $temp[0];
    $value[] = $temp[1];
    $text[] = $temp[2];
    $ip[] = $temp[3];
    $app[] = $temp[4];
    }

Моя вторая попытка:

//Performance: 0,125 seconds / 10.8 MB

while (($userinfo = fgetcsv($statisticsfile)) !== FALSE) {
   list ($timestamp[], $value[], $text, $ip, $app) = $userinfo;
}
  1. Есть ли способ еще больше повысить производительность, или мой метод настолько быстр, насколько это возможно?
  2. Возможно, важнее: есть ли способ определить, какие столбцы читаются, например, иногданужны только метки времени, плавающие столбцы.Есть ли лучший способ, чем мой путь (взгляните на мою вторую попытку:)

Спасибо:)

Ответы [ 2 ]

1 голос
/ 13 сентября 2012

Какова самая длинная линия?Передайте это как второй параметр в fgetcsv (), и вы увидите самое большое улучшение.

0 голосов
/ 10 октября 2011

Проверьте время, когда PHP прочитал этот файл:

Если bigg переместить файл на ramdisk или SSD

  1. [..] иногда только отметка времени

Что-то подобное

preg_match_all('#\d{10},\d{10}, (.*?),\d.\d.\d.\d,appname#',$f,$res);

print_r($res);
...