Массив, таблица бд или файловая система, что использовать?
Разбираю xlsx файл. Так как планируется обрабатывать файлы не меньше 50к строк - PHPEXCEL и другие библиотеки не подходят, так как жрут слишком много ресурсов. Другой формат использовать не получится, поэтому решил разбирать xlsx файл, построчно записывать его в другой файл, а потом уже импортировать.
При разборе файла есть два xml - shared и worksheet. worksheet хранит структуру листа, и указатели на значения из shareed. shared хранит уникальные значения ячеек.
Получается - при любом раскладке сначала нужно парсить shared.
Первым вариантом было: парсить shared в массив, а потом уже worksheet и построчно записывать в другой файл содержимое строки таблицы выбирая значения из массива.
На тестовом файле получился массив на 500к элементов, что не очень много, но массив висит в памяти и потребляет ресурсы (выходит около 60мб+-).
Вторым решением попробовал создавать вместо элементов массива файлы со именем - номером элемента массива, что решило мою проблему с памятью (средний расход скрипта 5-10мб), но увеличило время работы в разы, даже в 10 - 100 раз (время на создание 500к файлов).
Есть еще идея - хранить значения в табличке бд, но 500к запросов тоже не мало, плюс последующая их выборка по одному, умноженная на количество строк и столбцов.
Какой из трех вариантов лучше использовать?
Spout
Расход памяти у библиотеки: 10-20мб,
по времени дольше чем мое решение, а работает по второму принципу - запись shared в файл, но в каждый файл записывает не 1 значение а 10000, чтобы файлов получилось меньше, но время выполнения все-равно в разы больше, чем с массивом, что в моем случае пока не оправдано, в разнице 60мб - 20-40 сек или 20мб -20 минут выигрывает мое решение.
https://www.google.ru/search?q=phpexcel+big+data
при беглом просмотре я нашёл не одно решение парсинга огромных файлов экселя на PHPExcel. Выглядит вполне реально.
Не верб я в то что такая авторитетная и древняя библиотека не способна помочь в вашем кейсе.
Ссылка
Решение из поста: расход памяти от 200 до 1200 мб. Даже мой вариант с массивом от 4 до 24 раз экономнее. Да и 200 мб это уже очень много.
Да и варианты с решением вида: ini_set('memory_limit', '3500M');
выглядит так себе.