172 похожих чатов

Всем привет. Сижу тут расстраиваюсь. Хочу загнать в таблицу pg файл

на 1 млрд 54 млн строк. Сперва я хотел загнать его с условиями
str varchar UNIQUE NOT NULL
но потом сдался, сейчас добавляю вообще
str varchar
то есть уже убрал проверку на уникальность, убрал всё. Файл имеет особенность, там проблемы с кодировкой, не всё utf8 корректно, поэтому copy into не сработает.
Проблема.
Все эксперименты не уводят меня с одной скорости добавления до 1.5 млн строк в сутки. При этом работаю на локалхосте добавляю с java обычный update, файл с данными и база на разных винтах. ПЖ 13.
Вопрос.
нормальные ли это цифры? Может это какие то внутренние ограничения?

30 ответов

17 просмотров

Во первых если у вас жесткий диск то они медленные. Предположил потому что вы говорите винт. Во вторых раз не все у вас валидный utf-8, то возможно стоит добавлять через COPY в бинарном виде, а обрабатывать уже потом?

У вас структура таблички какая?

как вы из джава используя update заливаете данные?

ks- Автор вопроса
Alexey Bulgakov
как вы из джава используя update заливаете данные?

не понимаю вопрос. Беру update. И заливаю. Может вопрос делаю ли ? вместо переменной прямо в запрос? Да, делаю, чтобы ошибок не было.

ks
не понимаю вопрос. Беру update. И заливаю. Может в...

я тоже не понял. заливают обычно insert/copy команду покажите

ks- Автор вопроса
Alexey Bulgakov
я тоже не понял. заливают обычно insert/copy коман...

query = "INSERT INTO strtabltest(str) VALUES(?)"; pst.setString(1, readstr); pst.executeUpdate();

ks
query = "INSERT INTO strtabltest(str) VALUES(?)"; ...

а массивом залить не можете? не по одному значению, а сразу массив

ks- Автор вопроса
Alexey Bulgakov
а массивом залить не можете? не по одному значению...

как это? Я вот тут задумался, добавить по 50 строк. VALUES(?),(?),(?)...,(?) Сейчас попробую. А целый массив как? У меня оперативной памяти всего 8 гб. зы, попробую в смысле пишу в джава.

ks
как это? Я вот тут задумался, добавить по 50 строк...

можете и так попробовать, но в идеале вам выше написали COPY

Нашел в одном блоге упоминание http://ossc-db.github.io/pg_bulkload/index.html Не использовал, не знаю что из себя представляет.

Нет, ненормальны, это очень мало.

И да, при добавлении записей не должно быть ни одного update...

ks- Автор вопроса
Ilya Anfimov
Нет, ненормальны, это очень мало.

а сколько нормально? На сколько обычно база данных постгрес утилизирует скорость дисковой подсистемы? Допустим 1 гб строковый файл на 1 hdd (150 мегабайт в секунду), добавляем его в таблицу с одним полем 2 hdd (150 мегабайт). Копирование займёт ожидаемое время. А insert в базу?

ks
а сколько нормально? На сколько обычно база данных...

Если не очень забит и совсем без индэксов -- то где-то раза в три-пять медленнее. С одним индэксом на id -- ещё надо думать раз в полтора-два.

hdd, 20 в секунду? autocommit небось стоит. Числа похожые.

ks- Автор вопроса
Ilya Anfimov
Если не очень забит и совсем без индэксов -- то гд...

не понятно. то есть без индексов 30-50 мегабайт в секунду, а с индексом id — 100 мегабайт?

ks
query = "INSERT INTO strtabltest(str) VALUES(?)"; ...

если вы делаете это в один поток то вас ни что не спасет чтобы нагрузить диск таким образом, даже один, надо делать вставку параллельно в несколько потоков

ks- Автор вопроса
Denis
если вы делаете это в один поток то вас ни что не ...

не совсем понимаю логику. один поток получает данные и тут же отправляет их в таблицу. несколько потоков. Также один поток получает данные, чтение с винта то отлично идёт, я файл вообще на ssd положил. А вот как поможет несколько потоков pg для insert в одну таблицу? Почему несколько подлючений для пж будет лучше?

Denis
если вы делаете это в один поток то вас ни что не ...

Не особенно надо. Чуть-чуть можэт подняться, на SSD можэт и во сколько-то раз подняться (в мало раз). Но в общем -- много от этого не выиграть.

ks- Автор вопроса
Ilya Anfimov
Не особенно надо. Чуть-чуть можэт подняться, на SS...

опять же почему? Программа простейшая, у меня не куча, с постоянным заполнением в java 2 потока, один читает и заполняет, а второй записывает даннные в пж. А один поток, массив. Конечно, мне логично читать как можно быстрее файл.

ks
опять же почему? Программа простейшая, у меня не к...

Не забивайте себе мозг. Сначала проверьте autocommit. Потом, если не поможэт -- скорость формирования вашых строк (например, заменив insert на константу).

ks- Автор вопроса
Ilya Anfimov
Не забивайте себе мозг. Сначала проверьте autocomm...

я выше писал. Я сделал запись не по одному значению, а по 50 за раз. Скорость увеличилась в несколько раз.

ks
я выше писал. Я сделал запись не по одному значени...

Такая задача решается через batch insert в jdbc, точного синтаксиса не вспомню. Размер батча подбирается по производительности, но там будет порядка 1000 вставок, а не 50.

ks- Автор вопроса
Valery
Такая задача решается через batch insert в jdbc, т...

спасибо, почитаю. зы мне кстати это уже писали, я забыл проверить. Эх я...

ks
я выше писал. Я сделал запись не по одному значени...

В несколько -- это тожэ очень мало. Если бы дело было только в автокоммите, то вставка по 50 строк ускорила бы в 50 раз. Кроме того, в общем ускорение менее чем в 1000 раз -- это мало само по себе.

ks- Автор вопроса
Ilya Anfimov
В несколько -- это тожэ очень мало. Если бы дело б...

ясно. Я живу в физическом мире, а не матрице. На винт в 180 мегабайт оптимистичной скорости никак в 1000 раз не увеличу вставку данных.

ks
ясно. Я живу в физическом мире, а не матрице. На в...

На винт в 180 мегабайт оптимистичной скорости никак в 1000 раз не увеличу вставку данных. ну можно поставить zfs а там ОЗУ побольше и можно ускорить если не в 100 раз то довольно существенно

ks- Автор вопроса
central hardware
На винт в 180 мегабайт оптимистичной скорости ник...

да чо тянуть, сразу оперативки терабайт и рам диск, в него базу.

ks
ясно. Я живу в физическом мире, а не матрице. На в...

У вас в среднем по 30 байт на строку. Делим 180 мегабайт в секунду на 30 байт на строку -- получаем 6 миллионов записей в секунду. Делим ещё, допустим, на 10 (затраты на ACID) -- получаем 600 тысяч записей в секунду. Это в общем тот лимит, вышэ которого нет большого смысла пытаться перепрыгнуть -- но к которому можно стремиться. У вас, вы говорите, было 1.5 миллиона записей в сутки. Делим на количество секунд в сутках -- получается 20 записей в секунду. В 1000 раз большэ, чем 20 записей в секунду -- это 20 000 записей в секунду. Или в 30 раз медленнее, чем оцэнка того, к чему можно при жэлании стремиться и в 300 раз медленнее, чем скорость вашэго жёсткого диска. Это не быстро. Скорость в 1000 раз большэ, чем у вас в оригинале -- это небыстро. Но ужэ нормально. И это даст загрузку вашэго датасета за сутки. Что, в общем, тожэ не так плохо. Скорость в 100 записей в секунду, нет, пусть дажэ дажэ в 1000 записей в секунду -- это с одной стороны в сотни раз медленнее чем расчётный лимит, а с другой стороны -- это загрузка вашэго датасета за три недели. Это ненормально ни с какой стороны.

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта