Массовый оператор Select в SQL Server Python Service для вызова метода Cython - PullRequest
0 голосов
/ 13 июня 2018

Вопрос, связанный с машинным обучением : Служба SQL Server 2017 Python

Ошибка : MemoryError - Файл "cyproject \ util.pyx ", строка 10, в cyproject.util.json_to_list (я получаю эту ошибку, если я попытался выбрать> 7000 записей)

У меня большие наборы записей в одном из моих SQL ServerТаблица базы данных, а именно «sample_data».

enter image description here

Схема таблицы:

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]. [набор данных] это автоматически вычисляемый столбец , он вернет форму DECOMPRESS [dbo]. [sample_data]. [binarydata].(то есть N '[1,2,3,4,5,6]')

Я написал метод CYTHON для преобразования строки JSON (т. е. [dbo]. [sample_data].[набор данных]) в соответствующий список.

Метод 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

Я интегрировал указанный метод CYTHON в службу SQL Server 2017 PYTHON:

Пример кода: SQL SERVER SCRIPT (служба PYTHON)

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

Ошибка: MemoryError - Файл "cyproject \ util.pyx", строка 10, в cyproject.util.json_to_list (я получаю эту ошибку, если я попытался выбрать> 7000 записей)

Общее количество записей в таблице составляет около 74 КБ, оно может возрасти.Кроме того, указанная таблица содержит только сжатые данные (размер таблицы составляет 1,822 ГБ), размер несжатых данных составляет приблизительно> 9 ГБ.

При первоначальном выполнении он выгружает всю запись в Pandas DataFrame иЯ беру только значения столбца.Наконец, я передаю этот список значений методу CYTHON, и он возвращает list of numpy array.

Я не могу обработать более 7К записей, получаю ошибку памяти.Пожалуйста, помогите мне, как этого добиться.

...