有没有一种更快的方法可以使用pandas捕获巨大的数据帧(40GB)
我有3个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
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
如果您无法控制这些分块文件的格式,您显然需要至少支付一次读取成本,但是如果您执行大量其他读取/写入操作,转换它们仍然可以从长远来看为您节省一些时间
- (您是否可以连续处理每一行/区块/组(例如zipcode、用户id等)?例如,计算聚合、摘要统计、功能?或者您是否需要能够跨列(哪些列)或行(哪些列)应用任意筛选器?例如,“获取过去N天内使用服务X的所有用户id”。您可以根据您的使用情况选择更高性能的文件格式。有其他文件格式(HDF、拼花地板等)。有些文件格式针对列访问或行访问进行了优化,有些文件格式针对顺序或随机访问进行了优化。还有PySpark
- 您不必将数据集合并成一个巨大的120GB单片文件。
- 您的代码试图读入并存储每个文件的所有块,而不是在三个文件中逐块处理它们:
。请参阅对于文件中的文件:…chunks=pd.read_table(file,…chunksize=10000000)
- 修复该问题后,
参数不是内存块的大小;它只是块中的行数。该值大得惊人。如果组合数据帧的一行占用10Kb,则1e7这样的行的块将占用100Gb(!),这在大多数机器中都不适用chunksize=1e7
- (您是否可以连续处理每一行/区块/组(例如zipcode、用户id等)?例如,计算聚合、摘要统计、功能?或者您是否需要能够跨列(哪些列)或行(哪些列)应用任意筛选器?例如,“获取过去N天内使用服务X的所有用户id”。您可以根据您的使用情况选择更高性能的文件格式。有其他文件格式(HDF、拼花地板等)。有些文件格式针对列访问或行访问进行了优化,有些文件格式针对顺序或随机访问进行了优化。还有PySpark
- 您不必将数据集合并成一个巨大的120GB单片文件。
- 您的代码试图读入并存储每个文件的所有块,而不是在三个文件中逐块处理它们:
。请参阅对于文件中的文件:…chunks=pd.read_table(file,…chunksize=10000000)
- 修复该问题后,
参数不是内存块的大小;它只是块中的行数。该值大得惊人。如果组合数据帧的一行占用10Kb,则1e7这样的行的块将占用100Gb(!),这在大多数机器中都不适用chunksize=1e7