python - Python:合并大型数据集以及如何处理大型数据(500 Gb)
问题描述
我有一些大型 csv 文件,我需要将它们合并在一起。每个文件大约 5gb,我的 RAM 只有 8gb。我使用以下代码将一些 csv 文件读入数据框并将它们合并到列fund_ticker
ticker
和date
.
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。一些关于如何设置的指导将不胜感激。谢谢
解决方案
pandas 用户指南的“扩展到大型数据集”页面上讨论了一些选项
这里最简单的直接替换是使用dask
它使用 pandas api 的一个子集,因此应该很熟悉,并且它允许通过一次仅处理块来处理大于内存的数据帧。
然而,这种合并可能仍然相当缓慢。(首先将“fund_ticker”、“TICKER”和“Date”列设置为每个数据帧的索引会有所帮助。
推荐阅读
- java - jvm 在 Arrays.equals() 内崩溃
- json - 从javascript中提取数据
- vba - Excel - 在多个工作簿中隐藏相同的列
- javascript - 如何仅获取 JSON 数据的第一个元素?
- android - 在 Kotlin 中将 id 设置为 EditText
- angular - 直接在 Angular 6 中加载页面
- java - 未找到改造注释。(参数#2)
- hbase - 在 HBase 上使用 Janusgraph 时的一致性
- javascript - ReactJS 箭头主体周围的意外块语句
- angularjs - AngularJS ng-upload 重置文件选择