[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Большой файл прочитать, составить массив, импорт
waldicom
Всем привет.

Ситуация следующая: есть большой тесктовый файл (CSV).
В нем 24 млн строк, файл весит где-то 700 мб
Строки выглядят примерно так:
article1;group1;price
article1;group2;price
article1;group3;price
...
article2;group1;price
article2;group2;price
article2;group3;price

...
articleN;groupM;price


на выходе нужен массив, который будет выглядеть примерно так:

array(
'article1' => array(
'group1' => 'price',
'group2' => 'price',
'group3' => 'price',
),

'article2' => array(
'group1' => 'price',
'group2' => 'price',
'group3' => 'price',
),
)


Т.е. как бы сгруппировать по артиклям.

Проблема: артикли и группы идут не по-порядку.
что было сделано до этого:
- file(path-to-file)
- fopen(file);while(...){ $data = fgetscv(); allData[] = $data}
- SplFixedArray

пока все, что было испробавано, вываливается с ошибкой Fatal error: Allowed memory size of .....

Может у кого-нить есть идеи, как такое победить?

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
Valick
памяти не хватает
залей все в БД, и пагинируй как хошь))

_____________
Стимулятор ~yoomoney - 41001303250491
waldicom
В БД.... Вариант. Просто это же через LOAD DATA INFILE делать придется, а для этого не каждый сервак подойдет.

Но идея достойная, спасибо! Если не найду, как сделать на пхп, воспользуюсь таким путем.

Там потом еще вроде бы проблема с группировкой будет, потому что данные мне придется с этой временной таблицы обратно считывать в массив... Это будет некрасиво, но решаемо...

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
AllesKlar
waldicom
Я обычно для таких монстроических файлов на шарпе залепуху пишу, он десктоп, ему пофиг smile.gif
Если доступа к базе извне нет, то на том же шарпе генерируем "дамп", заливаем на хост, разворачивем.
А потом уже php.

_____________
[продано копирайтерам]
waldicom
Цитата (AllesKlar @ 6.02.2014 - 16:21)
Я обычно для таких монстроических файлов на шарпе залепуху пишу, он десктоп, ему пофиг


Це не вариант. На серевре линух. а это ему еще mono ставить придется. Но сама идея понятна.
Я подумывал в сторону bash'а, разделить файлы по артиклю, а потом импортировать маленькие файлы. Но это будет примерно 4000 маленьких файлов. Как-то некрасиво.

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
Valick
Цитата
Как-то некрасиво.

Стыдно у кого видно, а этот процесс, на сколько я понимаю разовый, не обязательно всем показывать smile.gif


_____________
Стимулятор ~yoomoney - 41001303250491
waldicom
Цитата (Valick @ 6.02.2014 - 16:31)
на сколько я понимаю разовый

sad.gif
Кажную ночь.
Я понимаю, что клиент видимо не слышал об инкрементальных апдейтах, но что имеем, то инадо импортировать.

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
sergeiss
Цитата (waldicom @ 6.02.2014 - 18:36)
через LOAD DATA INFILE делать придется, а для этого не каждый сервак подойдет

Почему не каждый сервак? Мускуль не всегда это поддерживает, что ли? Тогда можно использовать другую БД: Постгре, SQLite...
На крайняк, заливать данные в БД частями, через ПХП скрипт. Чуть дольше, чем одной командой, но лучше, чем ничего.

Честно говоря, не вижу тут проблем. Залил, создал индексы, отсортировал, вывел...

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Invis1ble
Цитата
Мускуль не всегда это поддерживает, что ли?

поддерживает, только наверное права нужны соответствующие

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

waldicom
Цитата (sergeiss @ 6.02.2014 - 16:49)
Мускуль не всегда это поддерживает, что ли?

Мускуль поддерживает, но как уже сказали выше, нужны соответствующие права. Но это не проблема.

Цитата (sergeiss @ 6.02.2014 - 16:49)
Честно говоря, не вижу тут проблем. Залил, создал индексы, отсортировал, вывел...

Проблема в том, чтобы выбрать все данные под одному артиклю (это обязательное условие и обойти его не получится). А значит мне нужно (или):
- сначала выбрать все артикли, а потом 4000 запросов в базу (тупо)
- выбрать всю инфу сразу с группировкой (GROUP_CONCAT + GROUP BY). Этот вариант мне нравится больше всего. Но по какой-то очень странной причине он выполняется у меня 7-8 секунд для одного артикля.

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
AllesKlar
Цитата (waldicom @ 6.02.2014 - 19:27)
Цитата (AllesKlar @ 6.02.2014 - 16:21)
Я обычно для таких монстроических файлов на шарпе залепуху пишу, он десктоп, ему пофиг


Це не вариант. На серевре линух. а это ему еще mono ставить придется. Но сама идея понятна.
Я подумывал в сторону bash'а, разделить файлы по артиклю, а потом импортировать маленькие файлы. Но это будет примерно 4000 маленьких файлов. Как-то некрасиво.

C++ ?

_____________
[продано копирайтерам]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.