【问题标题】:rxDataStep failing to load the data in SQL Server tablerxDataStep 未能在 SQL Server 表中加载数据
【发布时间】:2018-10-18 20:44:15
【问题描述】:

我正在尝试在经过一些转换后将 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 函数以块的形式处理数据,但为什么有更多的行数是个问题?因为相同的查询 ger 会导致 SQL 服务器。最大内存百分比也分配给 32 GB RAM 中的 50 个。

【问题讨论】:

  • 您要加载的数据有多大?检查此链接:support.microsoft.com/en-us/help/3171055/…,为什么不能分配超过 32GB 的空间?可能是您没有分配足够的资源,尝试将分配内存增加到 40Gb 并重新运行 SQL 脚本。
  • 问题应该是2M行的问题,即使8GB内存也应该绰绰有余,而且RevoscaleR使用块数据处理。当我检查数据大小时,它是 1.2GB。而且我已经将最大内存百分比分配给 50。

标签: r sql-server machine-learning microsoft-r revoscaler


【解决方案1】:

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;

【讨论】:

  • 感谢 Arun 的快速回复。我以前也尝试过这种方法。当我尝试时,我能够毫无错误地读取所有数据,但是在写入表时却失败了。例如,对于您编写的相同代码,我收到错误:[Microsoft][ODBC SQL Server Driver]String data, right truncation 但是当我从 rxDataStep 中取出 outfile 时,我收到消息:Rows Read: 10 ,处理的总行数:10,总块时间:0.069 秒我知道它适用于整个 2M 行。但是在这里进行测试时,我只使用了 10 行,即使这样也失败了。
  • 出现错误消息:[Microsoft][ODBC SQL Server Driver]String data, right truncation ...当我签入数据库时​​,创建的新输出表只有标头没有数据。跨度>
  • 根据错误,输入查询长度可能是一个问题(由于列数?),您可以使用 sqlQuery 参数而不是 RxSqlServerData 的表来解决问题吗?
  • 我只使用了 sqlQuery 参数而不是 inTabDS 的表,因为我正在从表中获取部分数据。 (select * from table where year = 2015(这有大约 120 列,2M 行。它看起来很大,但大小为 1GB,至少应该不会失败。可能需要更多时间。
猜你喜欢
  • 2016-10-24
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2012-01-15
相关资源
最近更新 更多