Как читать файл .csv за пакет - PullRequest
0 голосов
/ 29 ноября 2018

У меня вопрос, поэтому мой .csv

"product";"date";"q"
"8";"1995-05-01";"4"
"8";"1995-05-01";"2"
"8";"2001-05-01";"13"
"8";"2001-05-01";"3"
"9";"1995-05-01";"1"

У меня около 1 миллиона строк.Я делаю что-то вроде этого:

while (($row = fgetcsv($fpointer, 4096, ";")) !== false) {
     $data[$row[0]][$row[2]][] = $row;
}

Но этот процесс потребляет много памяти.Как я могу сделать по-другому?Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы можете использовать SplFileObject::fgetcsv

SplFileObject, позволяя читать строку за строкой, указанный размер (SplFileObject::fread) и т. Д. Без загрузки всего файла в память.

Я протестировал файл размером до 3.5GB без проблем.

Ссылка: https://github.com/sridharkalaibala/PHPLogFileViewer

0 голосов
/ 29 ноября 2018

Это потому, что вы используете больше памяти, не читаете всю память, а затем обрабатываете при обработке очень больших наборов данных.Вы можете обрабатывать данные партиями в цикле, например:

$limit = 0;
$data = [];

while($row = fgetcsv($fpointer, 4096, ";")) {
    $limit++;
    $data[$row[0]][$row[2]][] = $row;

    if (1000 <= $limit) {
        // process your data
        $data = [];
        $limit = 0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...