【问题标题】:Faster alternatives to csv and pandascsv 和 pandas 的更快替代品
【发布时间】:2020-06-03 11:56:06
【问题描述】:

我有需要附加到 csv 文件的数据增强代码。数据量以百万计。需要2-3天。有更快的替代方案吗?如果我们需要数百万级的追加操作,HDF5 的速度有多快?

编辑:代码:仅供参考

def insert_data(directory, annotated_csv, output_csv):
    data = pd.read_csv(annotated_csv)
    data.to_csv(output_csv,index = False)
    counter = 0
    print("number of files: ", len(os.listdir(directory)))

    datachunk = []

    for fname in glob.glob(directory + '/*jpg'):



        fname = fname.split('/')[-1]

        counter = counter + 1

        if counter % 10000 == 0:
            df_tmp = pd.DataFrame(data=datachunk, columns=data.columns)

            df_tmp.to_csv(output_csv,mode = 'a', index = False, header=False)

            datachunk = []

            print("counter: "+ str(counter))


        try:    
            ofile = fname.split("-")[0]
            flabel = "'" + fname.split("-")[3] + "'"

            ofile = ofile +'.jpg'

            BB, MB, SB = get_all_bb(data, ofile)

            BB[0] = fname
            MB[0] = fname
            SB[0] = fname

            BB[7] = flabel
            MB[7] = flabel
            SB[7] = flabel

            datachunk.append(BB)
            datachunk.append(MB)
            datachunk.append(SB)

        except:
            print("Exception on"+ str(fname))
            pass

    df_tmp = pd.DataFrame(data=datachunk, columns=data.columns)       
    df_tmp.to_csv(output_csv,mode = 'a', index = False, header=False)
    print("counter: "+ str(counter))

这段代码只是让我们一瞥正在发生的事情。

【问题讨论】:

  • 它不能在数据库中工作?
  • @sammywemmy 不,它不能。
  • 请分享您的代码。
  • 您是否分析过您的代码以查看慢速部分是什么? (我假设get_all_bb?)这看起来令人尴尬的并行(只需将for循环放入multiprocessing并从处理函数返回BB, MB, SB三元组)。
  • 另外,代替 Pandas,尝试将 pickled 对象附加到一个文件(或多个文件)中。然后,您可以将它们后处理为 CSV 或其他您有空的文件。

标签: python pandas hdf5


【解决方案1】:

使用简单的 pandas 只会利用 CPU 的一个核心进行计算。

解决办法:

您可以将 multiprocessing 与 pandas 结合使用,以加快此追加计算。使用多处理,您将能够根据 CPU 的内核数量减少处理时间。机器的核心数越多,处理时间就越短。

可以从此链接引用使用 pandas 的多处理示例实现:http://datumorphism.com/til/programming/pandas/pandas-parallel-multiprocessing/

更详细的解释可以参考: https://towardsdatascience.com/make-your-own-super-pandas-using-multiproc-1c04f41944a1

【讨论】:

    【解决方案2】:

    我建议您以 parquet 格式 (pd.to_parquet(file_name, engine="pyarrow") 保存您的数据。 这些是保留列数据类型的二进制压缩文件。

    parquet 的一个非常好的特性是您可以简单地将多个 parquet 文件(具有相同的列)存储在一个目录中,然后一次打开整个目录。 这些称为分区拼花存储,允许您无锁地追加数据。

    您还可以考虑使用 PySpark,因为它在大型数据集上的速度要快得多(查询优化、代码生成和多处理是免费的)。

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 2011-04-21
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 2012-03-21
      • 2022-10-07
      相关资源
      最近更新 更多