首页 > 解决方案 > Python:合并大型数据集以及如何处理大型数据(500 Gb)

问题描述

我有一些大型 csv 文件,我需要将它们合并在一起。每个文件大约 5gb,我的 RAM 只有 8gb。我使用以下代码将一些 csv 文件读入数据框并将它们合并到列fund_ticker tickerdate.

import numpy as np
import pandas as pd

# Read in data, ignore column "version"
table1 = pd.read_csv(r'C:\data\data1.csv', usecols=lambda col: col not in ["Version"])
table2 = pd.read_csv(r'C:\data\data2.csv', usecols=lambda col: col not in ["Version"])
weight = pd.read_csv(r'C:\data\data3.csv', usecols=lambda col: col not in ["Version"])

print("Finish reading")

# merge datasets
merged = data1.merge(data2, on=['fund_ticker', 'TICKER', 'Date']).merge(data3, on=['fund_ticker', 'TICKER', 'Date'])

不幸的是,我收到以下错误:

numpy.core._exceptions.MemoryError: Unable to allocate 105. MiB for an array with shape (27632931,) and data type object

在互联网上搜索后,我认为问题在于数据大于我的 RAM。为了克服这个问题,我正在考虑使用一些数据库,例如 SQL 或 parquet 文件。我的问题是处理大型数据集最有效的方法是什么?我的数据是财务数据,最高可达 500 Gb 或 1 Tb。一些关于如何设置的指导将不胜感激。谢谢

标签: pythonpython-3.xlarge-datapython-sql

解决方案


pandas 用户指南的“扩展到大型数据集”页面上讨论了一些选项

这里最简单的直接替换是使用dask

它使用 pandas api 的一个子集,因此应该很熟悉,并且它允许通过一次仅处理块来处理大于内存的数据帧。

然而,这种合并可能仍然相当缓慢。(首先将“fund_ticker”、“TICKER”和“Date”列设置为每个数据帧的索引会有所帮助。


推荐阅读