R — в любом случае, чтобы ускорить dbWriteTable?

#r #sql-server #dbi #r-dbi

Вопрос:

Я работаю с фреймом данных c. 700k строк и 400 столбцов, которые я загружаю на Microsoft SQL Server. В настоящее время я использую код:

 dbWriteTable(conn = con, 
                     name = "table_test", 
                     value = x,
                     row.names = FALSE
                     )
 

из библиотеки library(odbc) и con осуществляется ли мое соединение с помощью функции dbConnect

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

Комментарии:

1. Я использую DBI и odbc вставляю данные 2M строк (по крайней мере, еженедельно) уже несколько лет, и использование dbWriteTable (как вы обнаружили) слишком медленное, поэтому я использую инструмент командной строки bcp ( docs.microsoft.com/en-us/sql/tools/… ). У него есть некоторые проблемы ; а именно, он тупо думает о значениях в кавычках, игнорируя стандарт CSV (RFC-4180) для встроенных кавычек, и он не различает "" (пустая строка) и null. Хорошего инструмента нет, вам придется решать эти проблемы вручную.

2. @r2evans bcp.exe это безнадежное дело. Начиная с SQL Server 2017 BULK INSERT может работать с файлами RFC 4180. (Прошло всего двенадцать лет.)

3. Таким образом, информативно сказать, что сервер, к которому я могу получить доступ (но не администрирую), 2016 года (старше 4 лет). И это угнетает (меня). И они сохраняют уровень совместимости на уровне 120 (вместо 130 , что добавляет openjson и тому подобное).

4. @AlwaysLearning : BULK INSERT звучит здорово, если у вас есть доступ к BLOB-объектов Azure или файловую систему (например, протокол CIFS) работает как пользователем, так и сервер (я не собираюсь открывать окна делятся на «мой компьютер» для того, чтобы загрузить на сервер в основном (но не полностью), потому что Киф через SSH-это кошмар, благодаря Microsoft. Это хорошая идея, но вряд ли это решение для большинства пользователей.