Python 锁定dask.multiprocessing.get并将元数据添加到HDF

Python 锁定dask.multiprocessing.get并将元数据添加到HDF,python,pandas,locking,metadata,dask,Python,Pandas,Locking,Metadata,Dask,在纯Python中执行ETL任务时,我想收集每个原始输入文件的错误度量和元数据(错误度量是从文件的数据部分提供的错误代码计算出来的,而元数据存储在头文件中)。下面是整个过程的伪代码: import pandas as pd import dask from dask import delayed from dask import dataframe as dd META_DATA = {} # shared resource ERRORS = {} # shared resource d

在纯Python中执行ETL任务时,我想收集每个原始输入文件的错误度量和元数据(错误度量是从文件的数据部分提供的错误代码计算出来的,而元数据存储在头文件中)。下面是整个过程的伪代码:

import pandas as pd
import dask
from dask import delayed
from dask import dataframe as dd

META_DATA = {}  # shared resource
ERRORS = {}  # shared resource

def read_file(file_name):
    global META_DATA, ERRORS

    # step 1: process headers
    headers = read_header(file_name)
    errors = {}
    data_bfr = []

    # step 2: process data section
    for line in data_section:
        content_id, data = parse_line(line)
        if contains_errors(data):
            errors[content_id] = get_error_code(data)
        else:
            data_bfr.append(content_id, data)

    # ---- Part relevant for question 1 ----
    # step 3: acquire lock for shared resource and write metadata
    with lock.acquire():
        write_metadata(file_name, headers)  # stores metadata in META_DATA[file_name]
        write_errors(file_name, errors)  # stores error metrics in ERRORS[file_name]

    return pd.DataFrame(data=data_bfr,...)

with set_options(get=dask.multiprocessing.get):
    df = dd.from_delayed([delayed(read_file)(file_name) \
                          for file_name in os.listdir(wd)])

    # ---- Part relevant for question 2 ----
    df.to_hdf('data.hdf', '/data', 'w', complevel=9, \
        complib='blosc',..., metadata=(META_DATA, ERRORS))
对于每个输入文件
read_file
返回一个
pd.DataFrame
,进一步将相关元数据和错误度量写入共享资源。我正在使用
dask
的多处理调度程序从延迟
读取文件的操作列表中计算
dask.dataframe

  • 问题1:每个
    读取\u文件
    -操作都会写入共享资源
    元数据
    错误
    。我必须做些什么才能实现一个适用于
    dask.multiprocessing.get
    的正确锁定策略?从带有locket.lock_文件('.lock'):
-context的
中向集合写入元数据和错误信息是否足够?
多处理.RLock
工作吗?如何初始化锁以使用
dask
?更重要的是,如何将
元数据
错误
声明为
dask
中的共享资源
  • 问题2:如果可能,我想用元数据和错误度量对HDF数据进行注释。从a中,我了解到,
    dask
    目前不支持向数据帧添加元数据,但是否可以将信息写入HDF?如果是,在这种情况下如何处理对共享资源的访问
  • 不要依赖全局 Dask最适合与人合作

    特别是,您的案例在Python中是一个限制,因为它(正确地)不在进程之间共享全局数据。相反,我建议您显式地从函数返回数据:

    def read_file(file_name):
        ...
        return df, metadata, errors
    
    values = [delayed(read_file)(fn) for fn in filenames]
    dfs      = [v[0] for v in values]
    metadata = [v[1] for v in values]
    errors   = [v[2] for v in values]
    
    df = dd.from_delayed(dfs)
    
    import toolz
    metadata = delayed(toolz.merge)(metadata)
    errors = delayed(toolz.merge)(errors)
    

    在这种情况下,zip抱怨参数#1不可编辑:
    TypeError:zip参数#1必须支持迭代
    。你的食谱一般有效吗?我的
    read_文件
    返回一个
    DataFrame
    、一个
    dict
    和一个
    列表
    。事实上,我的示例是有缺陷的。现在修好了