Как я могу сделать рекурсивный запрос или подзапрос внутри запроса?

Tensorflow пытается выделить часть per_process_gpu_memory_fraction памяти GPU для процесса. (См. Комментарии в GPUOptions источника Tensorflow). Значение по умолчанию для этого - 95%. Если это значение изменено на значение, которое ваш GPU не может обработать, вы можете увидеть ошибку CUDA_OUT_OF_MEMORY. Эта ошибка также может быть повышена, если другой процесс использует GPU и занимает память, которую Tensorflow считает, что она будет иметь.

Если вы хотите избежать использования CPU, вы можете использовать allow_growth=True. Когда вы используете allow_growth = True, память GPU не будет предварительно распределена и сможет расти по мере необходимости.

2
задан marc_s 20 January 2019 в 20:50
поделиться

1 ответ

Введение: ваша скрипка БД показывает, что вы, похоже, используете MySQL 8.0.

Поскольку у вас уже есть рабочий запрос, и вам просто нужно обработать конкретный случай mode = 'Return', одним из решений может быть преобразование вашего запроса в CTE и самостоятельное его присоединение, чтобы поместить записи Return относительно их первоначального Buy. ,

Это работает в этой скрипте дБ :

WITH cte AS (
    SELECT * FROM (SELECT
           id, date, code, mode, quantity, price, price_currency, usd_to_ars, return_id,
           @acm := @acm + quantity as stock,
           @avr := (@avr * (@acm - quantity) +
                   if(quantity > 0, quantity *
                       if(mode = "Return", @avr,
                            if(price_currency = 'USD', price, price / usd_to_ars)
                         ),
                       quantity * @avr)
                     ) / @acm as average_price_usd
    FROM
        transactions t1,
        (SELECT @acm := 0) x,
        (SELECT @avr := 0) y) t2
)
SELECT
    cte.id, 
    cte.date,
    cte.code,
    cte.mode,
    cte.quantity,
    cte.price,
    cte.price_currency,
    cte.usd_to_ars,
    cte.return_id,
    cte.stock,
    COALESCE(cte2.average_price_usd, cte.average_price_usd) average_price_usd
FROM cte LEFT JOIN cte cte2 ON cte.mode = 'Return' AND cte2.id = cte.return_id
ORDER BY cte.id DESC

Также кажется, что вы, вероятно, также могли бы достичь своей цели, используя оконные функции MySQL 8.0 [117 ]. Логика для вычисления average_price_usd мне неясна, однако вот запрос, который вычисляет запас, используя эту технику. Возможно, вы могли бы изменить его, добавив логику для средней цены (она должна идти в часть CTE вышеуказанного запроса):

SELECT 
    id,
    code,
    date,
    mode,
    quantity,
    price,
    price_currency,
    usd_to_ars,
    return_id,
    SUM(quantity) OVER (ORDER BY date) stock,
    NULL average_price_usd
FROM transactions
ORDER BY date desc

РЕДАКТИРОВАТЬ : вот (некрасиво) обходной путь для MySQL < 8.0, с использованием двух подзапросов (см. this db fiddle ):

SELECT
    cte.id, 
    cte.date,
    cte.code,
    cte.mode,
    cte.quantity,
    cte.price,
    cte.price_currency,
    cte.usd_to_ars,
    cte.return_id,
    cte.stock,
    COALESCE(cte2.average_price_usd, cte.average_price_usd) average_price_usd
FROM 
    (
        SELECT
            id, date, code, mode, quantity, price, price_currency, usd_to_ars, return_id,
            @acm := @acm + quantity as stock,
            @avr := (@avr * (@acm - quantity) +
                   if(quantity > 0, quantity *
                       if(mode = "Return", @avr,
                            if(price_currency = 'USD', price, price / usd_to_ars)
                         ),
                       quantity * @avr)
                     ) / @acm as average_price_usd
        FROM
            transactions t1,
            (SELECT @acm := 0) x,
            (SELECT @avr := 0) y
    ) cte
    LEFT JOIN (
        SELECT
            id, date, code, mode, quantity, price, price_currency, usd_to_ars, return_id,
            @acm2 := @acm2 + quantity as stock,
            @avr2 := (@avr2 * (@acm2 - quantity) +
                   if(quantity > 0, quantity *
                       if(mode = "Return", @avr2,
                            if(price_currency = 'USD', price, price / usd_to_ars)
                         ),
                       quantity * @avr2)
                     ) / @acm2 as average_price_usd
        FROM
            transactions t1,
            (SELECT @acm2 := 0) x,
            (SELECT @avr2 := 0) y
    ) cte2 ON cte.mode = 'Return' AND cte2.id = cte.return_id
ORDER BY cte.id DESC
0
ответ дан GMB 20 January 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: