Python 如何使用Dask从google云存储中读取多个大型CSV文件块,而不同时导致内存过载

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

我正在尝试从google存储中读取大量的csv文件(多个文件)。我使用Dask分发库进行并行计算,但我在这里面临的问题是,尽管我提到了块大小(100mb),但我不确定如何逐分区读取并将其保存到我的postgres数据库中,这样我就不想让内存过载

    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和互斥选项-请阅读延迟的文档。