Dask.delayed在类

时间:2017-11-22 17:46:26

标签: python shared-memory python-multiprocessing dask

我有一个包含497个pandas数据框的文件夹存储为.parquet文件。文件夹总维度为7.6GB。

我正在努力开发一个简单的交易系统。所以我创建了两个不同的类,主要的是Portfolio 1,然后这个类为数据文件夹中的每个数据帧创建一个Asset对象。

import os
import pandas as pd
from dask.delayed import delayed


class Asset(file):
    def __init__:
        self.data_path = 'path\\to\\data\\folder\\'
        self.data = pd.read_parquet(self.data_path + file, engine='auto')

class Portfolio:
    def __init__:
        self.data_path = 'path\\to\\data\\folder\\'
        self.files_list = [file for file in os.listdir(self.data_path) if file.endswith('.parquet')]
        self.assets_list = []
        self.results = None
        self.shared_data = '???'

    def assets_loading(self):
        for file in self.files_list:
            tmp = Asset(file)
            self.assets_list.append(tmp)

    def dask_delayed(self):
        for asset in self.assets_list:
            backtest = delayed(self.model)(asset)

    def dask_compute(self):
        self.results = delayed(dask_delayed)
        self.results.compute()

    def model(self, asset):
        # do shet

if __name__ == '__main__':
    portfolio = Portfolio()
    portfolio.dask_compute()

我做错了,因为它看起来没有处理结果。如果我尝试检查portfolio.results控制台打印:

Out[5]: Delayed('NoneType-7512ffcc-3b10-445f-928a-f01c01bae29c')

以下是我的问题:

  1. 你能解释一下我的错误吗?
  2. 当我运行assets_loading()函数时,我基本上将整个数据文件夹加载到内存中以加快处理速度,但它使我的RAM饱和(16GB可用)。我没想到一个7.6GB的文件夹可以让16GB RAM饱和,这就是我想使用Dask的原因。任何与我的脚本工作流程兼容的解决方案?
  3. 还有另一个问题,可能是更大的问题。使用Dask我试图同时在多个资产上并行化模型函数,但是我需要一个共享内存(脚本中的self.shared_data)来存储一些位于每个Dask进程内的变量值到Portfolio对象(对于例如,单一资产的年度表现)。您能解释一下我如何在Dask延迟流程之间共享数据以及如何将这些数据存储在Portfolio的变量中?
  4. 非常感谢

1 个答案:

答案 0 :(得分:1)

exports.login = async function(req, res) { var email = req.body.email; await pool.query('SELECT * FROM users WHERE users.email = ?', [email], function( error, results, fields ) { if (error) { res.send({ code: 400, failed: "Error ocurred" }); } else { if (results.length > 0) { //Mail authorized res.send({ code: 200, success: "Sucessfull login" }); } else { //Mail unauthorized res.send({ code: 403, failed: "Unauthorized mail" }); } } }); }; 行有一些问题:

  • 在这里你创建了一个延迟函数,而不是延迟结果;你需要调用延迟功能
  • 此处未定义
  • self.results = delayed(dask_delayed),您可能需要dask_delayed
  • 方法self.dask_delayed不会返回任何内容
  • 你调用dask_delayed(延迟函数不存在,只有延迟结果),但不存储输出 - 计算不会就地发生,就像你想象的那样。

你可能想要

.compute()

现在你需要修复self.result = delayed(self.dask_delayed)().compute() ,以便返回一些内容。它不应该调用更多延迟函数,因为它本身已经被延迟了。

最后,为了用dask_delayed()填充内存,我不会惊讶于数据的内存版本更大,压缩/编码是镶木地板格式的目标之一。您可以尝试使用pd.read_parquet,这是懒惰/按需。