rxDataStep не удалось загрузить данные в таблицу SQL Server - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь загрузить результат SQL-запроса в новую таблицу после некоторого преобразования.Но даже самый простой скрипт дает сбой.

   DECLARE @inquery nvarchar(max) = N'
   SELECT TOP 2000000  * from SQL Table'

   DECLARE @Rscript nvarchar(max) = N'

            sqlConnString = "Driver={SQL Server};SERVER='+@@SERVERNAME+N';DATABASE='+DB_NAME()+N';Trusted_Connection=True;"
            outTabName <- "OutputTable"
            outTabDS <- RxSqlServerData(table = outTabName, connectionString = sqlConnString)
          rxDataStep(inData = InputDataSet, outFile = outTabDS, maxRowsByCols = NULL, rowsPerRead = 500000)
   '
   EXEC sp_execute_external_script @language = N'R'
          , @script = @Rscript
          , @input_data_1 = @inquery
   WITH result sets none;

Когда я запускаю это с 1M строк, он работает, но не может писать с 2M строк.Если функция RevoScaleR обрабатывает данные в блоках, то почему проблема с большим количеством строк?Потому что тот же самый запрос приводит к SQL-серверу.Максимальный процент памяти также выделяется для 50 из 32 ГБ ОЗУ.

1 Ответ

0 голосов
/ 19 октября 2018

Функции RevoScaleR обрабатывают данные порциями при использовании источников данных, таких как RxSqlServerData.В этом случае, если вы используете RxSqlServerData для входных данных вместо фрейма данных, вы не должны выходить за пределы памяти.Вот пример:

DECLARE @Rscript nvarchar(max) = N'

    sqlConnString = "Driver={SQL Server};SERVER='+@@SERVERNAME+N';DATABASE='+DB_NAME()+N';Trusted_Connection=True;"
    inTabName <- "InputTable"
    outTabName <- "OutputTable"
    inTabDS <- RxSqlServerData(table = inTabName, connectionString = sqlConnString)
    outTabDS <- RxSqlServerData(table = outTabName, connectionString = sqlConnString)
  rxDataStep(inData = inTabDS, outFile = outTabDS, maxRowsByCols = NULL, rowsPerRead = 500000)'
EXEC sp_execute_external_script @language = N'R'
      , @script = @Rscript
WITH result sets none;
...