Улучшить производительность SQLite INSERT-в-секунду?

Я не пользователь Windows, поэтому отвечай мой ответ с солью. Согласно Cookbook Windows PowerShell , PowerShell предварительно обрабатывает вывод git diff, разделяя его по строкам. Документация команды Out-File предполагает, что > совпадает с | Out-File без параметров. Мы также находим этот комментарий в документации PowerShell :

Результаты использования командлета Out-File могут быть не такими, какие вы ожидаете, если вы привыкли к традиционному перенаправлению вывода , Чтобы понять его поведение, вы должны знать контекст, в котором работает командлет Out-File.

По умолчанию командлет Out-File создает файл Unicode. Это лучший дефолт в долгосрочной перспективе, но это означает, что инструменты, которые ожидают файлы ASCII, будут работать неправильно с выходным форматом по умолчанию. Вы можете изменить выходной формат по умолчанию на ASCII с помощью параметра Encoding:

[...]

Out-file форматирует содержимое файла, чтобы он выглядел как консольный вывод. Это приводит к усечению вывода так же, как и в консольном окне в большинстве случаев. [...]

Чтобы получить результат, который не заставляет привязки строк соответствовать ширине экрана, вы можете использовать параметр Width для указания ширины линии.

blockquote>

So , по-видимому, это не Git, который выбирает кодировку символов, но Out-File. Это предполагает, a) что перенаправление PowerShell действительно должно использоваться только для текста и b) что

| Out-File -encoding ASCII -Width 2147483647 my.patch

избежит проблем с кодировкой. Однако это все еще не решает проблему с линейными окончаниями Windows и Unix. Есть командлеты (см. PowerShell Community Extensions ) для преобразования строк.

Однако, вся эта перекодировка не повышает мою уверенность в патче (который не имеет кодировки сама по себе, а просто строка байтов). Вышеупомянутая Cookbook содержит сценарий Invoke-BinaryProcess, который можно использовать для перенаправления вывода команды без изменений.

Чтобы обойти эту проблему, альтернативой будет использование git format-patch вместо git diff. format-patch записывает непосредственно в файл (а не в stdout), поэтому его вывод не перекодируется. Тем не менее, он может создавать патчи только от коммитов, а не от произвольных различий.

format-patch принимает диапазон фиксации (например, master^10..master^5) или одиночный фиксатор (например, X, то есть X..HEAD), и создает патч-файлов формы NNNN-SUBJECT.patch, где NNNN является увеличением 4-значного числа, и предметом является (искалеченный) объект патча. Выходной каталог можно указать с помощью -o.

2825
задан 17 revs, 10 users 35% 24 April 2019 в 13:14
поделиться

2 ответа

Несколько советов:

  1. Поместите вставки / обновления в транзакцию.
  2. Для более старых версий SQLite - рассмотрите менее параноидальный режим журнала ( pragma journal_mode ). Есть НОРМАЛЬНОЕ , а затем ВЫКЛ , что может значительно увеличить скорость вставки, если вы не слишком беспокоитесь о том, что база данных может быть повреждена в случае сбоя ОС. Если ваше приложение выйдет из строя, с данными все будет в порядке. Обратите внимание, что в более новых версиях настройки ВЫКЛ / ПАМЯТЬ небезопасны для сбоев на уровне приложений.
  3. Игра с размерами страниц также имеет значение ( PRAGMA page_size ). Чем больше размер страницы, тем быстрее чтение и запись, так как большие страницы хранятся в памяти. Обратите внимание, что для вашей базы данных будет использоваться больше памяти.
  4. Если у вас есть индексы, рассмотрите возможность вызова CREATE INDEX после выполнения всех вставок. Это значительно быстрее, чем создание индекса с последующим выполнением вставок.
  5. Вы должны быть очень осторожны, если у вас есть одновременный доступ к SQLite, так как вся база данных блокируется при выполнении записи, и, хотя возможны несколько считывателей, запись будет заблокирован. Это было несколько улучшено с добавлением WAL в новых версиях SQLite.
  6. Воспользуйтесь преимуществом экономии места ... небольшие базы данных работают быстрее. Например, если у вас есть пары ключ-значение, попробуйте сделать ключ INTEGER PRIMARY KEY , если это возможно, что заменит подразумеваемый столбец с уникальным номером строки в таблице.
  7. Если вы используете несколько потоков, вы можете попробовать использовать общий кеш страниц , который позволит совместно использовать загруженные страницы между потоками,
748
ответ дан 22 November 2019 в 19:47
поделиться

Массовый импорт, по-видимому, лучше всего работает, если вы можете фрагментировать операторы INSERT / UPDATE . Значение 10 000 или около того хорошо сработало для меня в таблице с несколькими строками, YMMV ...

48
ответ дан 22 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: