我尝试在进行一些转换后将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 Server。最大内存百分比也分配给32 GB RAM中的50个。
答案 0 :(得分:0)
在使用RxSqlServerData之类的数据源时,RevoScaleR函数将按块处理数据。在这种情况下,如果将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;