SQL Server Python服务中的大容量Select语句调用Cython方法
机器学习相关问题:SQL Server 2017 Python服务 错误:内存错误-文件“cyproject\util.pyx”,第10行,在 cyproject.util.json_to_列表(如果我试图选择>7000条记录,就会出现此错误) 我的一个SQL Server数据库表“sample\u data”中有大量记录集 表的架构是SQL Server Python服务中的大容量Select语句调用Cython方法,python,sql-server,python-3.x,cython,sql-server-2017,Python,Sql Server,Python 3.x,Cython,Sql Server 2017,机器学习相关问题:SQL Server 2017 Python服务 错误:内存错误-文件“cyproject\util.pyx”,第10行,在 cyproject.util.json_to_列表(如果我试图选择>7000条记录,就会出现此错误) 我的一个SQL Server数据库表“sample\u data”中有大量记录集 表的架构是 CREATE TABLE [dbo].[sample_data]( [index] [bigint] IDENTITY(0,1) NOT NU
CREATE TABLE [dbo].[sample_data](
[index] [bigint] IDENTITY(0,1) NOT NULL PRIMARY KEY,
[binarydata] [varbinary](max) NOT NULL,
[dataset] AS CAST(DECOMPRESS([binarydata]) AS varchar(max))
[datacount] [int] NOT NULL,
)
二进制数据包含JSON字符串值COMPRESS(N'[1,2,3,4,5,6]')
样本数据
INSERT INTO [dbo].[sample_data]
([binarydata]
,[datacount])
VALUES
(COMPRESS(N'[1,2,3,4,5,6]')
, 6)
注意:[dbo].[sample_data]。[dataset]是一个自动计算列,它将
返回[dbo].[sample_data].[binarydata]的解压缩形式。(即:。,
N'[1,2,3,4,5,6]')
我编写了一个CYTHON方法来将JSON字符串(即[dbo].[sample_data].[dataset])转换为适当的列表
CYTHON法:
def json_to_list(list json_array):
cdef:
list result = []
str item
for item in json_array:
result.append(np.array(json.loads(item)))
return result
我在SQL Server 2017 PYTHON服务中集成了上述CYTHON方法:
示例代码:SQL SERVER脚本(PYTHON服务)
错误:MemoryError-文件“cyproject\util.pyx”,第10行,在
cyproject.util.json_to_列表(如果我尝试
选择>7000条记录)
表中的总记录约为74K,可能会增加。此外,所述表格仅包含压缩数据(表格大小为1.822 GB),未压缩数据大小约>9 GB
在初始执行中,它将整个记录转储到DataFrame,我只获取列值。最后,我将这些值列表传递给CYTHON方法,它返回numpy数组的列表
我无法处理超过7K条记录,内存出错。请帮助我如何做到这一点。这个问题与机器学习无关。
-请不要垃圾邮件标签(已删除)。@desertnaut-没有问题。谢谢。您可以尝试确保numpydtype
是最小的合适数据类型(例如np.int16
或np.int32
)。您也可以尝试在json_data
上使用list.pop
来释放一些内存(但我不知道使用pop
前后移动会有多高效)
DECLARE @pscript NVARCHAR(MAX);
SET @pscript = N'
# assign SQL Server dataset to df
df = InputDataSet
import cyproject.util
json_array = df.dataset.values
result = cyproject.util.json_to_list(json_array.tolist())
';
DECLARE @sqlscript NVARCHAR(MAX);
SET @sqlscript = N'
SELECT TOP (7500)
[dataset]
FROM [dbo].[sample_data]';
EXEC sp_execute_external_script
@language = N'Python',
@script = @pscript,
@input_data_1 = @sqlscript