#mysql #macos #csv #workbench
#mysql #macos #csv #workbench
Вопрос:
У меня Macbook pro 2019 touch, i5, 8M, HD 256 ГБ, используется 75 ГБ, OSX 10.15.2. Установлены AMPPS 3.9 и MSQL Workbench 8.0
Я импортирую на Localhost таблицу mysql в формате csv 1,9 ГБ на 15 миллионов регистров, через 12 часов было импортировано только 3 миллиона.
Уже проверил XAMPP VM, и в консоли MariaDB не удалось загрузить ДАННЫЕ В ФАЙЛ. Он отключается от базы данных.
Я собираюсь обработать таблицу с помощью PHP. Любая помощь или рекомендация, чтобы эти процессы стали быстрее?
Я использую Sequel pro для чтения удаленных баз данных, очень быстро, но больше не работает для localhost.
Комментарии:
1. проверьте журналы ошибок, у оболочки нет ограничения по времени, запустите ее с помощью -e mariadb.com/kb/en/mysql-command-line-client
Ответ №1:
У меня была аналогичная проблема при импорте файла CSV (около 5 миллионов записей) в таблицу mysql. Мне удалось сделать это с помощью nodejs, поскольку он способен открывать и читать файл построчно (без загрузки всего файла в оперативную память). Скрипт считывает 100 строк, затем делает вставку, затем считывает еще 100 строк и так далее. Он обработал весь файл примерно за 9 минут. Он использует readline
модуль. Основная часть скрипта выглядит примерно так:
const Fs = require('fs');
const Mysql = require('mysql2');
const Readline = require('readline');
const fileStream = Fs.createReadStream('/path/to/file');
var dbConnection = Mysql.createConnection({
host : "yourHost",
user : "yourUser",
password : "yourPassword",
database : "yourDatabase"
});
const rl = Readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
async function run() {
var lineElements = [];
for await (const line of rl) {
// Each line in will be successively available here as `line`.
lineElements = line.split(",");
// now lineElements is an array containing all the values of the current line
// here you can queue up multiple lines, to make a bigger insert
// or just insert line by line
await dbConnection.query('INSERT INTO ..........');
}
}
run();
Приведенный выше скрипт вставляет по строке на запрос. Не стесняйтесь изменять его, если вы хотите, чтобы запрос вставлял 100 строк или любое другое значение.
В качестве примечания: поскольку мой файл был «доверенным», я не использовал подготовленные инструкции, так как считаю, что простой запрос выполняется быстрее. Я не знаю, был ли значительный прирост скорости, поскольку я не проводил никаких тестов.