Запись обоих промежуточных и результатов в файл с помощью Dask - PullRequest
0 голосов
/ 27 января 2020

У меня есть приложение-скрипт данных, которое использует dask для go через базу данных и производит некоторые промежуточные продукты, которые затем объединяют эти промежуточные продукты для получения результата. Теперь я хотел бы эффективно выписать промежуточные продукты и результат, но, как вы можете видеть ниже, я нашел только очень неэффективный способ, при котором вы вычисляете промежуточные продукты больше, чем единицы.

import dask.bag as db
from other_functions import *

input = db.read_text(file1)
processing_parameter = parse_mapping_parameters(file2)

intermediates = []
for p in mapping_parameter:
    intermediate = input.map(lambda x: process(x, p))
    intermediates.append(intermediate)

products = intermediates.pop(0)

for intermediate in intermediates:
    products = product.products(i)

result = products.map(calc_result)

for i, intermediate in enumerate(intermediates):
    intermediate.to_textfiles(f'./data/intermediate_{i}.*.txt')

result.to_textfiles(f'./data/result.*.txt')

Альтернатива, которую я вижу, состоит в том, чтобы записать промежуточные файлы в файл, а затем использовать отдельный сценарий для повторного считывания их в память и генерирования результатов, но с точки зрения ввода-вывода, что также неэффективно. Есть ли лучший способ сделать это в сумерках?

1 Ответ

0 голосов
/ 14 февраля 2020

Закончилось решение проблемы следующим образом:

import dask.bag as db
from other_functions import *

input = db.read_text(file1)
processing_parameter = parse_mapping_parameters(file2)

to_compute = []
intermediates = []
for i, p in enumerate(mapping_parameter):
    intermediate = input.map(lambda x: process(x, p))
    to_compute.append(
        intermediate.to_textfiles(f'./data/intermediate_{i}.*.txt', compute=False)
    intermediates.append(intermediate)

products = intermediates.pop(0)
for intermediate in intermediates:
    products = product.products(i)

result = products.map(calc_result)

to_compute.append(result.to_textfiles(f'./data/result.*.txt', compute=False))
dask.compute(*to_compute)

Не понял, что у метода to_text есть параметр, позволяющий получить ленивого писателя. Однажды я увидел, что это было очевидно. Не уверен, насколько это эффективно.

...