Я получаю файлы в потоковом режиме раз в 30 секунд. Файлы могут иметь до 40 столбцов и 50000 строк. Файлы являются TXT-файлами и разделены табуляцией. Прямо сейчас я сохраняю файл временно, сохраняю содержимое загрузить данные во временную таблицу в базе данных и затем удалите файл.
Я хотел бы избежать процесса сохранения и удаления и вместо этого сохранить данные непосредственно в базу данных. Поток является $output
Вот:
protected function run(OutputInterface $output)
{
$this->readInventoryReport($this->interaction($output));
}
Я все время гуглял, пытаясь найти «производительность — это большая проблема» — верный ответ на этот вопрос, но я не могу найти хороший способ сделать это без сохранения данных в файл и использования загрузки данных , Мне нужно, чтобы содержимое было доступно быстро и работало с ними после их сохранения во временной таблице. (Обновить другие таблицы с содержанием …)
Есть ли хороший способ справиться с этим, или метод сохранения и удаления файла вместе с загрузкой данных infile будет лучше, чем другие решения?
Сервер, на котором я работаю, имеет SSD и 32 ГБ оперативной памяти.
LOAD DATA INFILE
это ваш самый быстрый способ сделать тоннажем данных в MySQL с малой задержкой.
Вы можете написать себе php-программу, которая, используя подготовленные операторы и т. П., Довольно хорошо вставит строки в вашу базу данных. Если вы договорились сделать COMMIT
каждые пару сотен строк, и использовать подготовленные операторы, и тщательно писать свой код, это будет довольно быстро, но не так быстро, как LOAD DATA INFILE
, Зачем? Операции с отдельными строками должны быть сериализованы в сетевой провод, затем десериализованы и обработаны по одной (или двум, или десяти) за раз. LOAD DATA
просто хлюпает ваши данные локально.
Похоже, у вас есть хороший сервер MySQL. Но сериализация все еще является узким местом.
50 тысяч записей каждые 30 секунд, а? Это много! Являются ли какие-либо из этих данных избыточными? То есть какие-либо строки в более позднем пакете данных перезаписывают строки в более раннем пакете? Если это так, вы можете написать программу, которая будет пропускать строки, которые устарели.
Других решений пока нет …