Arrays 如何使用多处理从python中的数据帧创建gzip文件
我有一个进程正在成为IO绑定,我将一个大型数据集从数据库拉到一个pandas数据帧中,然后尝试逐行处理,然后保存到一个gzip文件。我试图找到一种使用多处理的方法,能够将gzip的创建拆分为多个进程,然后将它们合并到一个文件中。或在不覆盖前一个线程的情况下并行处理。我找到了这个包p_tqdm,但我遇到了EOF问题,可能是因为线程相互覆盖。以下是我当前解决方案的示例:Arrays 如何使用多处理从python中的数据帧创建gzip文件,arrays,python-3.x,multithreading,Arrays,Python 3.x,Multithreading,我有一个进程正在成为IO绑定,我将一个大型数据集从数据库拉到一个pandas数据帧中,然后尝试逐行处理,然后保存到一个gzip文件。我试图找到一种使用多处理的方法,能够将gzip的创建拆分为多个进程,然后将它们合并到一个文件中。或在不覆盖前一个线程的情况下并行处理。我找到了这个包p_tqdm,但我遇到了EOF问题,可能是因为线程相互覆盖。以下是我当前解决方案的示例: from p_tqdm import p_map df = pd.read_sql(some_sql, engine) thin
from p_tqdm import p_map
df = pd.read_sql(some_sql, engine)
things =[]
for index, row in df.iterrows():
things.append(row)
p_map(process, things)
def process():
with gzip.open("final.gz", "wb") as f:
value = do_somthing(row)
f.write(value.encode())
我不知道关于
p\u tqdm
的问题,但是如果我理解你的问题,那么使用多处理
可能很容易做到
像这样的
import multiprocessing
def process(row):
# take care that "do_somthing" must return class with encode() method (e.g. string)
return do_somthing(row)
df = pd.read_sql(some_sql, engine)
things =[]
for index, row in df.iterrows():
things.append(row)
with gzip.open("final.gz", "wb") as f, multiprocessing.Pool() as pool:
for processed_row in pool.imap(process, things):
f.write(processed_row.encode())
只有几条旁注:
- pandas
方法很慢-如果可能,请避免(请参阅)iterrows
- 另外,您不需要创建
,只需将iterable传递给东西
(甚至可以直接传递df.iterrows())即可节省一些内存imap
- 最后,既然您似乎正在读取sql数据,为什么不直接连接到db并从
query在光标上迭代,同时跳过SELECT…
pandas
cur.execute(“SELECT*FROM x”)
然后对cur中的行执行:…
。(该行通常是一个数据元组。)检查例如。我认为多重处理不会给您带来很多性能改进(它有相当大的开销),但这取决于您的用例。