Как эффективно загрузить данные из CSV в базу данных? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть файл CSV / TSV с данными, и я хочу загрузить эти данные CSV в базу данных. Я использую Java или Python и PostgreSQL, чтобы сделать это (я не могу изменить это).

Проблема в том, что для каждой строки я делаю INSERT-запрос, и это не так эффективно, если я скажу 600.000 строк. Есть ли более эффективный способ сделать это?

Мне было интересно, могу ли я взять больше строк и создать только один большой запрос и выполнить его в моей базе данных, но я не уверен, поможет ли это вообще или должно Я делю данные на, может быть, скажем, 100 штук и выполняю 100 запросов?

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

Если файл CSV совместим с форматом, требуемым для copy from stdin, то наиболее эффективным способом является использование CopyManager API.

См. этот ответ или этот ответ для примера кода.


Если ваш входной файл не совместим с Postgres 'командой копирования, вам нужно написать INSERT самостоятельно. Но вы можете ускорить процесс, используя пакетную обработку JDB C:

Что-то вроде:

PreparedStatement insert = connection.prepareStatement("insert into ...");
int batchSize = 1000;
int batchRow = 0;
// iterate over the lines from the file
while (...) {
   ... parse the line, extract the columns ...
   insert.setInt(1, ...);
   insert.setString(2, ...);
   insert.setXXX(...);
   insert.addBatch();
   batchRow ++;
   if (batchRow == batchSize) {
     insert.executeBatch();
     batchRow = 0);
   }
}
insert.executeBatch();

Использование reWriteBatchedInserts=true в вашем JDB C URL улучшит производительность еще больше.

0 голосов
/ 09 марта 2020

Предполагая, что сервер может получить доступ к файлу напрямую, вы можете попробовать использовать команду COPY FROM . Если ваш CSV имеет неправильный формат, он все равно может быть быстрее переписать его в то, что будет обрабатывать команда COPY (например, при копировании в местоположение, к которому сервер может получить доступ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...