Быстрая работа с файлами данных
Знакомый програмист рассказал, как ему дали проект, где нужно было ускорить работу сайта, сделанного коллегами-индусами. После недолгого копания, он обнаружил, что данные везде получаются из БД построчно — циклами на PHP.
Часто и мы пишем что-то подобное.
Например, когда дело касается файлов данных. Поговорим о CSV (данные, разделённые запятыми). Да, есть в PHP функции fgetcsv()/fputcsv(), но они парсят файл построчно. Что на продакшн-объёмах есть тормоза и нагрузки.
Для тех, кто не в курсе, рассказываю страшную тайну: если эти данные должны попасть в базу данных, то есть такая вещь, как BULK INSERT — это когда разбором файла и его загрузкой в БД занимается сам сервер БД. Результаты просто плачевные (это слёзы радости): 500 Мб файл пожирается за несколько секунд, в то время как при построчной обработке потребуется не один час.
Как это юзать.
Есть два пути — консольные проги и SQL.
Консольные проги смотрите в поставке своего сервера. Для MS SQL это bcp, для MySQL — mysqlimport. Всё просто — указываешь файл, имя таблицы, разделители и рвёшь чеку.
C SQL как-то привычнее. В MySQL есть стандартная структура LOAD DATA INFILE, которая, получив нужные параметры, скушает ваш файл, не поперхнувшись. Ищите — и обрящете, упомяну только, что кодировка при парсинге задаётся глобальной переменной, если, например, пользовательский файл не в кодировке сервера по умолчанию:
SET SESSION character_set_database = utf8;
Кроме того, опыт показал, что XML и XLS (Excel) в базу грузится намного быстрее, если даже силами РНР с 8 мегабайтами его дефолтовой памяти преобразовать их в CSV, а потом загрузить полученный файл указанным методом.
Что касается выгрузки данных из БД, то тоже можно обойтись без построчного онанизма, а использовать старый добрый SELECT. Опять же, для всеми-гонимого-всеми-любимого MySQL это пишется так:
SELECT *
FROM 'test'
INTO OUTFILE 'c:\\1.txt';
Ссылки по теме:
LOAD DATA INFILE Syntax
Class: Quick CSV import
ua_mysql Google Group
Преобразование XML в структуру
MySQL: быстрая работа с CSV-файлами
Импорт данных в базы MySQL
Все про українське ІТ в телеграмі — підписуйтеся на канал DOU
19 коментарів
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.