Python多处理异常处理数据分块
我正在尝试使用多处理模块来加速一些数据处理,其想法是我可以向启动的每个进程发送一块数据,以利用我机器上的所有内核,而不是一次只发送一个 因此,我使用pandas read_fwf()函数为数据构建了一个迭代器,每次chunksize=50000行。我的问题是迭代器最终应该引发StopIteration,我试图在子进程中的Exception块中捕获它,并使用队列将其传递给父线程,让父线程知道它可以停止生成子进程。虽然我不知道出了什么问题,但现在发生的是,它到达了数据的末尾,然后继续生成实际上什么都不做的进程Python多处理异常处理数据分块,python,exception-handling,pandas,multiprocessing,Python,Exception Handling,Pandas,Multiprocessing,我正在尝试使用多处理模块来加速一些数据处理,其想法是我可以向启动的每个进程发送一块数据,以利用我机器上的所有内核,而不是一次只发送一个 因此,我使用pandas read_fwf()函数为数据构建了一个迭代器,每次chunksize=50000行。我的问题是迭代器最终应该引发StopIteration,我试图在子进程中的Exception块中捕获它,并使用队列将其传递给父线程,让父线程知道它可以停止生成子进程。虽然我不知道出了什么问题,但现在发生的是,它到达了数据的末尾,然后继续生成实际上什么都
def MyFunction(data_iterator, results_queue, Placeholder, message_queue):
try:
current_data = data_iterator.next()
#does other stuff here
#that isn't important
placeholder_result = "Eggs and Spam"
results_queue.put(placeholder_result)
return None
except StopIteration:
message_queue.put("Out Of Data")
return None
results_queue = Queue() #for passing results from each child process
message_queue = Queue() #for passing the stop iteration message
cpu_count = cpu_count() #num of cores on the machine
Data_Remaining = True #loop control
output_values = [] #list to put results in
print_num_records = 0 #used to print how many lines have been processed
my_data_file = "some_data.dat"
data_iterator = BuildDataIterator(my_data_file)
while Data_Remaining:
processes = []
for process_num in range(cpu_count):
if __name__ == "__main__":
p = Process(target=MyFunction, args=(data_iterator,results_queue,Placeholder, message_queue))
processes.append(p)
p.start()
print "Process " + str(process_num) + " Started" #print some stuff to
print_num_records = print_num_records + 50000 #show how far along
print "Processing records through: ", print_num_records #my data file I am
for i,p in enumerate(processes):
print "Joining Process " + str(i)
output_values.append(results_queue.get())
p.join(None)
if not message_queue.empty():
message = message_queue.get()
else:
message = ""
if message == "Out Of Data":
Data_Remaining = False
print "STOP ITERATION NOW PLEASE"
更新:
我发现数据迭代器有问题。我的数据集中大约有800万行,在它处理完800万行之后,它实际上从未返回StopIteration,它不断地返回相同的14行数据。以下是构建我的数据迭代器的代码:
def BuildDataIterator(my_data_file):
#data_columns is a list of 2-tuples
#headers is a list of strings
#num_lines is 50000
data_reader = read_fwf(my_data_file, colspecs=data_columns, header=None, names=headers, chunksize=num_lines)
data_iterator = data_reader.__iter__()
return data_iterator
首先,我将把
MyFunction
以外的所有内容放入if\uuuuu name\uuuu==“\uuuu main\uuuu”:
块中。你根本不想让工作进程运行代码,对吗?对,我不想让工作进程运行代码,但我在启动工作进程时没有遇到任何问题,在终止主线程时遇到了问题。