Начало » Использование СУБД » PostgreSQL » parallel insert into table (загрузка данных в таблицу из 11000 файлов)
parallel insert into table [сообщение #748] |
Tue, 04 October 2022 07:44 |
danilov_a
Сообщений: 1 Зарегистрирован: October 2022
|
Junior Member |
|
|
Всем доброго дня
Искал в инете но пока конкретного ответа (совета) не нашел.
Задача - загрузить данные в таблицу из примено 11000 CSV файлов
- перед вставкой из таблицы удалены все индексы и primary key,
- сделано alter table XXX set unlogged
Если загружать последовательно (файл за файлом) то это занимает около 7 часов
Если загружать ОДНИМ большим файлом (в котором содержатся данные из всех тех фалов
рамер около 20Гб), то около 2-ч часов
Меня заставляют перейти на пофайловую загрузку малых файлов ... т.к.
их выгрузка (из Ignite) распараллелена и занимает около 1,5 часов
Вот и мне говорят сделай так же!!! ... но Ignite (database in memory) это не PostgreSQL
Или все-таки можно както распараллелить insert в PostgreSQL
PS: сейчас каждый файл загружается вот так -
из пакета postgresql-42.2.18.jar вызывается CopyManager
......
StringBuilder sb;// - содержимое файла
LibPostgreServer pgJDBC;
pgJDBC.copyIn("COPY " + table + " FROM STDIN WITH (FORMAT text, DELIMITER '" + delimiter + "', ENCODING 'WIN1251') ", sb.toString());
public final long copyIn(String query, String str) {
long copyRows = 0;
try (ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes())) {
Connection conn = LibPostgreServer.getConnection().unwrap(BaseConnection.class );
CopyManager copyManager = new CopyManager((BaseConnection) conn);
copyRows = copyManager.copyIn(query, in);
closeConnection(conn);
} catch (Exception ex) {
LibLogger.logMessageThrown(LibLogger.SEVERE, null, ex);
}
return copyRows;
}
|
|
|
|
Переход к форуму:
Текущее время: Sun Dec 22 07:17:31 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00669 секунд
|