Python多处理队列thows WindowsError:系统找不到指定的文件

Python多处理队列thows WindowsError:系统找不到指定的文件,python,pandas,multiprocessing,Python,Pandas,Multiprocessing,我有一个包含文件子目录的目录,我从每个子目录中的文件中提取熊猫数据帧形式的信息,然后使用多处理将每个熊猫数据帧重新连接到一个csv文件中。我使用队列存储每个进程返回的本地数据帧,并将它们附加到文件中以避免写冲突。这是我的密码: def work(cmd, q): df_local = function_which_returns_dataframe(cmd) if not df_local.empty: q.put(df_local) else:

我有一个包含文件子目录的目录,我从每个子目录中的文件中提取熊猫数据帧形式的信息,然后使用多处理将每个熊猫数据帧重新连接到一个csv文件中。我使用队列存储每个进程返回的本地数据帧,并将它们附加到文件中以避免写冲突。这是我的密码:

def work(cmd, q):
    df_local = function_which_returns_dataframe(cmd)
    if not df_local.empty:
        q.put(df_local)
    else:
        print("Empty:", cmd)

def listener(file, q):
    while True:
        line = q.get()
        if isinstance(line, pd.DataFrame):
            line.to_csv(file, mode='a', header=False)
        elif line == 'kill':
            return

def main(args):    
    cpus = multiprocessing.cpu_count()
    patient_dirs = [os.path.join(args.input_dir, x) for x in os.listdir(args.input_dir)]
    threads = []
    file = os.path.join(args.output_dir, 'concepts_all_%s.csv' % identifier)

    #setup manager with write access to file
    manager = multiprocessing.Manager()
    q = manager.Queue()
    header_df = pd.DataFrame(columns=['patient_id', 'lookup_id', 'begin_inx', 'end_inx', 'mention_type', 'codingScheme', 'code', 'preferredText', 'word_phrase'])
    header_df.loc[len(header_df)] = ['patient_id', 'lookup_id', 'begin_inx', 'end_inx', 'mention_type', 'codingScheme', 'code', 'preferredText', 'word_phrase']
    q.put(header_df)

    #start write process
    writer_process = multiprocessing.Process(target=listener, args=(file, q))
    writer_process.start()

    # now spawn processes from each patient dir*
    while threads or patient_dirs:
        if (len(threads) < cpus) and patient_dirs:
            p = multiprocessing.Process(target=work, args=[patient_dirs.pop(), q])
            p.start()
            threads.append(p)
        else:
            for thread in threads:
                if not thread.is_alive():
                    threads.remove(thread)

    #finish write
    q.put('kill')
    writer_process.join()


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('input_dir', type=str)
    parser.add_argument('output_dir', type=str)
    args = parser.parse_args()
    main(args)
def工作(cmd,q):
df\u local=返回数据帧(cmd)的函数
如果不是df_local.empty:
q、 put(df_本地)
其他:
打印(“空:”,cmd)
def侦听器(文件,q):
尽管如此:
line=q.get()
如果isinstance(行,pd.数据帧):
line.to_csv(文件,mode='a',header=False)
elif行=='kill':
返回
def主(args):
cpu=多处理。cpu_计数()
patient_dirs=[os.path.join(args.input_dir,x)代表os.listdir(args.input_dir)中的x]
线程=[]
file=os.path.join(args.output\u dir,'concepts\u all\u%s.csv'%identifier]
#具有文件写入权限的安装管理器
manager=multiprocessing.manager()
q=manager.Queue()
header_df=pd.DataFrame(列=['patient_id','lookup_id','begin_inx','end_inx','notify_type','codingScheme','code','preferredText','word_phrase'])
header_-df.loc[len(header_-df)]=['patient_-id','lookup_-id','begin_-inx','end_-inx','notify_-type','codingScheme','code','preferredText','word_-phrase']
q、 放置(收割台位置)
#开始写入进程
writer\u process=multiprocessing.process(target=listener,args=(file,q))
writer_进程开始()
#现在从每个患者目录生成流程*
当线程或患者指令:
如果(len(threads)
这段代码在较小的测试目录上运行良好,但在较大的目录上运行一段时间后,我开始收到以下错误消息:

Traceback (most recent call last):
  File "C:\Python27\Lib\multiprocessing\process.py", line 258, in _bootstrap
    self.run()
  File "C:\Python27\Lib\multiprocessing\process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "I:\sutter\multiproc_test.py", line 20, in work
    q.put(df_local)
  File "<string>", line 2, in put
  File "C:\Python27\Lib\multiprocessing\managers.py", line 755, in _callmethod
    self._connect()
  File "C:\Python27\Lib\multiprocessing\managers.py", line 742, in _connect
    conn = self._Client(self._token.address, authkey=self._authkey)
  File "C:\Python27\Lib\multiprocessing\connection.py", line 167, in Client
    c = PipeClient(address)
  File "C:\Python27\Lib\multiprocessing\connection.py", line 383, in PipeClient
    win32.WaitNamedPipe(address, 1000)
WindowsError: [Error 2] The system cannot find the file specified
回溯(最近一次呼叫最后一次):
文件“C:\Python27\Lib\multiprocessing\process.py”,第258行,在_bootstrap中
self.run()
文件“C:\Python27\Lib\multiprocessing\process.py”,第114行,正在运行
自我目标(*自我参数,**自我参数)
文件“I:\sutter\multiproc\u test.py”,第20行,正在工作中
q、 put(df_本地)
文件“”,第2行,输入
文件“C:\Python27\Lib\multiprocessing\managers.py”,第755行,在调用方法中
self._connect()
文件“C:\Python27\Lib\multiprocessing\managers.py”,第742行,在_connect中
conn=self.\u客户端(self.\u token.address,authkey=self.\u authkey)
客户端第167行的文件“C:\Python27\Lib\multiprocessing\connection.py”
c=管道客户端(地址)
PipeClient中第383行的文件“C:\Python27\Lib\multiprocessing\connection.py”
win32.WaitNamedPipe(地址,1000)
WindowsError:[错误2]系统找不到指定的文件
队列的大小是否受到限制,或者我是否没有正确设置写入方法?这可能与处理返回空数据帧的情况有关吗?

相反,its的语法与pandas相似,只有它的并行(本质上是它的大量并行pandas DataFame)和惰性(这有助于避免ram限制)

如果要提取的文件类型例如为
csv
,请执行以下操作:

from dask.distributed import Client  
import dask.dataframe as dd

client = Client() #  ensures multiprocessing

ddf = dd.read_csv(r'sub\**\*.csv')  # reads all the csv files inside of the subdirectories of the subdirectories
如果文件属于不同类型,并且熊猫可以读取它们,dask也很可能可以读取它们

对于
xml
,它看起来像这样:

import dask 
from glob import iglob

@dask.delayed  # this function will now run via the multiprocessing client 
def work(files_path):
    df_local = function_which_returns_dataframe(files_path)
    if not df_local.empty:
        return df_local 
    else:
        print("Empty:", files_path)

client = Client() #  ensures multiprocessing
files_paths = iglob(r'sub\**\*.xml') # an iterator of all the xml file paths

# read lazily all the xml files
delayed_objs = (work(files_path) for files_path in files_paths) 

ddf = dd.from_delayed(delayed_objs)  # combine to one dataframe
我建议您阅读并提供一个
meta
to
from\u delayed

如果您希望将
ddf
转换为
pandas.DataFrame
,只需执行以下操作:

df = ddf.compute() 

谢谢实际上,我有一个自定义函数,可以将XML文件提取为类似csv的格式,这就是我使用pandas的原因。然后,您可以使用
glob
delayed
在答案中进行编辑,所有这些“类似csv的格式”
dataframe
是否具有相同的模式?是的。谢谢--还没有签出glob。您是否了解队列编写器无法工作的原因?