Python 如何使用Dask从google云存储中读取多个大型CSV文件块,而不同时导致内存过载
我正在尝试从google存储中读取大量的csv文件(多个文件)。我使用Dask分发库进行并行计算,但我在这里面临的问题是,尽管我提到了块大小(100mb),但我不确定如何逐分区读取并将其保存到我的postgres数据库中,这样我就不想让内存过载Python 如何使用Dask从google云存储中读取多个大型CSV文件块,而不同时导致内存过载,python,pandas,postgresql,dask,dask-distributed,Python,Pandas,Postgresql,Dask,Dask Distributed,我正在尝试从google存储中读取大量的csv文件(多个文件)。我使用Dask分发库进行并行计算,但我在这里面临的问题是,尽管我提到了块大小(100mb),但我不确定如何逐分区读取并将其保存到我的postgres数据库中,这样我就不想让内存过载 from dask.distributed import Client from dask.diagnostics import ProgressBar client = Client(processes=False) i
from dask.distributed import Client
from dask.diagnostics import ProgressBar
client = Client(processes=False)
import dask.dataframe as dd
def read_csv_gcs():
with ProgressBar():
df = dd.read_csv('gs://mybucket/renish/*.csv', blocksize=100e6)
pd = df.compute(scheduler='threads')
return pd
def write_df_to_db(df):
try:
from sqlalchemy import create_engine
engine = create_engine('postgresql://usr:pass@localhost:5432/sampledb')
df.to_sql('sampletable', engine, if_exists='replace',index=False)
except Exception as e:
print(e)
pass
pd = read_csv_gcs()
write_df_to_db(pd)
上面的代码是我的基本实现,但正如前面所说的,我希望以块的形式阅读它并更新数据库。差不多
df = dd.read_csv('gs://mybucket/renish/*.csv', blocksize=100e6)
for chunk in df:
write_it_to_db(chunk)
可以在Dask中执行吗?或者我应该使用pandas的chunksize并进行迭代,然后将其保存到DB中(但我在这里错过了并行计算)
有人能解释一下吗?这行
df.compute(scheduler='threads')
说明:将数据以块的形式加载到工作线程中,并将它们全部连接到一个内存数据帧中,df
。这不是你想要的。您希望在块出现时插入它们,然后将它们从内存中删除
您可能想使用map\u分区
df = dd.read_csv('gs://mybucket/renish/*.csv', blocksize=100e6)
df.map_partitions(write_it_to_db).compute()
或者使用df.to\u delayed()
请注意,根据您的SQL驱动程序,您可能无法以这种方式获得并行性,如果不能,pandas iter chunk方法也可以工作。谢谢,那么我应该使用df.to\u delay(write\u it\u to\u db)之类的方法吗,相信它会将它们从内存中删除,或者我们应该同时使用map_分区和to_delayed?map_分区以及to_delayed和互斥选项-请阅读延迟的文档。