有没有一种更快的方法可以使用pandas捕获巨大的数据帧(40GB)

有没有一种更快的方法可以使用pandas捕获巨大的数据帧(40GB),pandas,performance,memory,concat,Pandas,Performance,Memory,Concat,我有3个40GB大小的巨大数据帧,我用块打开它们。然后,我想把它们连接在一起。以下是我尝试过的: path = 'path/to/myfiles' files = [os.path.join(path,i) for i in os.listdir(path) if i.endswith('tsv')] for file in files: cols = ['col1','col2','col3'] chunks = pd.read_tabl

我有3个40GB大小的巨大数据帧,我用块打开它们。然后,我想把它们连接在一起。以下是我尝试过的:

    path = 'path/to/myfiles'
    files = [os.path.join(path,i) for i in os.listdir(path) if i.endswith('tsv')]
    for file in files:
        cols = ['col1','col2','col3']
        chunks = pd.read_table(file, sep='\t', names=cols, chunksize=10000000)
然而,当我尝试连接所有文件时,这会花费很长时间。
我想提出一些建议,以更快地连接所有数据帧。

.tsv
.csv
是读/写速度相当慢的格式。我发现拼花地板最适合我最后做的大部分事情。它的读写速度非常快,还允许您轻松地将文件的分块文件夹作为单个表读回。但是,它确实需要字符串列名:

In [102]: df = pd.DataFrame(np.random.random((100000, 100)), columns=[str(i) for i in range(100)])

In [103]: %time df.to_parquet("out.parquet")
Wall time: 980 ms

In [104]: %time df.to_csv("out.csv")
Wall time: 14 s

In [105]: %time df = pd.read_parquet("out.parquet")
Wall time: 195 ms

In [106]: %time df = pd.read_csv("out.csv")
Wall time: 1.53 s

如果您无法控制这些分块文件的格式,您显然需要至少支付一次读取成本,但是如果您执行大量其他读取/写入操作,转换它们仍然可以从长远来看为您节省一些时间。

.tsv
.csv
是读/写速度相当慢的格式。我发现拼花地板最适合我最后做的大部分事情。它的读写速度非常快,还允许您轻松地将文件的分块文件夹作为单个表读回。但是,它确实需要字符串列名:

In [102]: df = pd.DataFrame(np.random.random((100000, 100)), columns=[str(i) for i in range(100)])

In [103]: %time df.to_parquet("out.parquet")
Wall time: 980 ms

In [104]: %time df.to_csv("out.csv")
Wall time: 14 s

In [105]: %time df = pd.read_parquet("out.parquet")
Wall time: 195 ms

In [106]: %time df = pd.read_csv("out.csv")
Wall time: 1.53 s
如果您无法控制这些分块文件的格式,您显然需要至少支付一次读取成本,但是如果您执行大量其他读取/写入操作,转换它们仍然可以从长远来看为您节省一些时间

  • CSV/TSV是一种非常慢的文件格式,没有经过优化
  • 您可能不需要将整个数据集保存在内存中。您的用例可能不需要对整个组合(120GB)数据集进行完全随机的列和行访问
    • (您是否可以连续处理每一行/区块/组(例如zipcode、用户id等)?例如,计算聚合、摘要统计、功能?或者您是否需要能够跨列(哪些列)或行(哪些列)应用任意筛选器?例如,“获取过去N天内使用服务X的所有用户id”。您可以根据您的使用情况选择更高性能的文件格式。有其他文件格式(HDF、拼花地板等)。有些文件格式针对列访问或行访问进行了优化,有些文件格式针对顺序或随机访问进行了优化。还有PySpark
    • 您不必将数据集合并成一个巨大的120GB单片文件。
  • 您是说运行时很慢,但很可能是内存耗尽(在这种情况下,运行时将退出窗口),因此首先检查内存使用情况。
    • 您的代码试图读入并存储每个文件的所有块,而不是在三个文件中逐块处理它们:
      对于文件中的文件:…chunks=pd.read_table(file,…chunksize=10000000)
      。请参阅
    • 修复该问题后,
      chunksize=1e7
      参数不是内存块的大小;它只是块中的行数。该值大得惊人。如果组合数据帧的一行占用10Kb,则1e7这样的行的块将占用100Gb(!),这在大多数机器中都不适用
  • 如果您必须坚持使用CSV,在三个文件中的每一个文件中处理一个块,然后将其输出写入文件,不要将所有块都留在内存中。还可以减小块大小(例如尝试1e5或更小,并测量内存和运行时的改善情况)。也不要硬编码,计算每台机器的sane值,和/或将其作为命令行参数。监视内存使用情况
  • CSV/TSV是一种非常慢的文件格式,没有经过优化
  • 您可能不需要将整个数据集保存在内存中。您的用例可能不需要对整个组合(120GB)数据集进行完全随机的列和行访问。
    • (您是否可以连续处理每一行/区块/组(例如zipcode、用户id等)?例如,计算聚合、摘要统计、功能?或者您是否需要能够跨列(哪些列)或行(哪些列)应用任意筛选器?例如,“获取过去N天内使用服务X的所有用户id”。您可以根据您的使用情况选择更高性能的文件格式。有其他文件格式(HDF、拼花地板等)。有些文件格式针对列访问或行访问进行了优化,有些文件格式针对顺序或随机访问进行了优化。还有PySpark
    • 您不必将数据集合并成一个巨大的120GB单片文件。
  • 您是说运行时很慢,但很可能是内存耗尽(在这种情况下,运行时将退出窗口),因此首先检查内存使用情况。
    • 您的代码试图读入并存储每个文件的所有块,而不是在三个文件中逐块处理它们:
      对于文件中的文件:…chunks=pd.read_table(file,…chunksize=10000000)
      。请参阅
    • 修复该问题后,
      chunksize=1e7
      参数不是内存块的大小;它只是块中的行数。该值大得惊人。如果组合数据帧的一行占用10Kb,则1e7这样的行的块将占用100Gb(!),这在大多数机器中都不适用
  • 如果您必须坚持使用CSV,在三个文件中的每一个文件中处理一个块,然后将其输出写入文件,不要将所有块都留在内存中。还可以减小块大小(例如尝试1e5或更小,并测量内存和运行时的改善情况)。也不要硬编码,计算每台机器的sane值,和/或将其作为命令行参数。监视内存使用情况
  • 你研究过了吗?我自己还没有机会使用它,但我听到了关于这个项目的好消息,而且数据太大,无法存储。谢谢你的建议