Python:在多处理进程之间共享大型数据帧

Python:在多处理进程之间共享大型数据帧,python,dataframe,multiprocessing,Python,Dataframe,Multiprocessing,我不熟悉Python和多处理。 我必须将2个大型xml(约6GBs)文件解析为2个数据帧。 两个文件都可以独立处理 据我在Python中所学,我可以通过多处理来做到这一点。 所以 用于解析xml1文件并将其加载到dataframe的进程1 用于解析xml2文件并将其加载到dataframe的进程2 现在我想将进程1生成的数据帧用于进程2 谁能告诉我哪种方法是最好的? 我主要关心的是在进程之间共享数据帧 问候 Vipul您使用多个进程主要是因为您希望并行读取数据。一旦它被读入,似乎就没有太多的理由

我不熟悉Python和多处理。 我必须将2个大型xml(约6GBs)文件解析为2个数据帧。 两个文件都可以独立处理

据我在Python中所学,我可以通过多处理来做到这一点。 所以 用于解析xml1文件并将其加载到dataframe的进程1 用于解析xml2文件并将其加载到dataframe的进程2

现在我想将进程1生成的数据帧用于进程2 谁能告诉我哪种方法是最好的? 我主要关心的是在进程之间共享数据帧

问候
Vipul

您使用多个进程主要是因为您希望并行读取数据。一旦它被读入,似乎就没有太多的理由继续两个过程了。也就是说,您的进程应该读取数据,然后终止并让主进程继续

但是,我建议使用
多线程
而不是
多处理
。这些差异并不总是显而易见的,但是
多线程
将使在主线程和子线程之间共享全局变量变得更简单(我将在下面对此进行解释)。多线程的另一个优点是,如果单个线程失败,它不会导致整个应用程序崩溃。多处理的情况并非如此。请参阅此处的更多信息:

要习惯Python中的并行工作方式需要一些时间,您必须注意的一个主要问题是如何确保您所做的是线程安全的。通常,用于向线程传递数据和从线程传递数据的机制是队列。这确保在任何给定时间只有一个线程访问同一对象

也就是说,在您的简单示例中,您可以简单地定义两个全局变量并启动两个线程,每个线程将数据读入这些全局变量中的一个(即,不跨线程共享变量)。您还必须告诉主线程等待两个线程完成后再继续,否则主线程可能会在子线程仍在处理数据时尝试访问数据。(同样,通常您会采用基于队列的策略来避免此问题,但这里不一定需要)

下面是一些示例代码:

import threading
import pandas as pd
import time

def get_df_1():
    #set the scope of the variable to "global", meaning editing it here, it is edited globally
    global df_1 

    # read in your xml file here (for the example I simply create some dummy data)
    data = [['tom', 10], ['nick', 15], ['juli', 14]]
    df_1 = pd.DataFrame(data, columns=['Name', 'Age'])

    # wait five seconds (for illustration purposes to simulate  working time)
    time.sleep(5)
    print("df_1 fetched")

def get_df_2():
    global df_2
    data = [['tom', 176], ['nick', 182], ['juli', 167]]
    df_2 = pd.DataFrame(data, columns=['Name', 'Height'])
    time.sleep(5)
    print("df_2 fetched")

df_1 = None
df_2 = None

#define threads
t1 = threading.Thread(target=get_df_1)
t2 = threading.Thread(target=get_df_2)

# start threads
t1.start()
t2.start()

#this will print immediately
print("Threads have been started")

# wait until threads finish
t1.join()
t2.join()

#this will only print after the threads are done
print("Threads have finished")

print(df_1)
print(df_2)

欢迎来到python多处理世界!你能不能再多说一点你想要达到的目标?在流程之间共享资源可能很快变得复杂,通常只有在非常特定的情况下才有必要。嗨,Karl,下面将解释我试图实现的目标。xml1包含学生信息StudentID,Name xml2包含StudendID、地址、标记、评分。由进程1和进程2生成的数据帧具有匹配的StudentID列。现在,我想根据匹配的StudentID列,从dataframe 1更新dataframe 2中的其他列,例如地址、标记、评级,这样我的最终dataframe 2应该有StudentID、名称、地址、标记、评级列