如何使用 python pandas 在本地系统 Jupyter Notebook 中读取两个较大的 5GB csv 文件?如何在本地加入两个数据框进行数据分析?

Posted

技术标签:

【中文标题】如何使用 python pandas 在本地系统 Jupyter Notebook 中读取两个较大的 5GB csv 文件?如何在本地加入两个数据框进行数据分析?【英文标题】:How to read two larger 5GB csv files in local system Jupyter Notebook using python pandas? how to join two dataframes for data analysis in local? 【发布时间】:2020-05-10 11:18:53 【问题描述】:

如何使用 python pandas 在本地系统 Jupyter Notebook 中上传两个大 (5GB) 每个 csv 文件。请建议任何配置来处理大型 csv 文件以进行数据分析?

Local System Configuration:
OS: Windows 10
RAM: 16 GB
Processor: Intel-Core-i7

代码:

dpath = 'p_flg_tmp1.csv'
pdf = pd.read_csv(dpath, sep="|") 

Error:
MemoryError: Unable to allocate array

pd.read_csv(po_cust_data, sep="|", low_memory=False)

Error:
ParserError: Error tokenizing data. C error: out of memory

如何处理本地系统中两个较大的 csv 文件进行数据分析?如果可能,请在使用 python pandas 的本地系统中建议更好的配置。

【问题讨论】:

检查dask dask api 表现不错!!但许多功能和过滤器不可用,如用于数据分析的 pandas api。 然后检查其他答案,相关:***.com/questions/25962114/… 这个 csv 文件看起来如何(多少列和 dtypes)?如果您编写了这个 csv 文件,请考虑使用更有效的替代方案,例如 HDF5 格式来处理更大的数据集。 @max9111 每个文件最多有 10 列。都是主要数据类型(字符串、varchar、双精度、时间戳、数字等)。 【参考方案1】:

如果您不需要一次处理所有内容,则可以使用块:

reader = pd.read_csv('tmp.sv', sep='|', chunksize=4000)   
for chunk in reader:
     print(chunk)

请参阅 Pandas 的 Documentation 了解更多信息。

如果您需要一次处理所有内容并且分块确实不是一个选项,那么您只剩下两个选项

    增加系统的 RAM 切换到另一种数据存储类型

一个 csv 文件在 RAM 中占用大量内存,请参阅 this article 了解更多信息,即使它用于另一个软件,它也能很好地解决问题:

内存使用

您可以使用这个简单的方法来估算 CSV 文件的内存使用情况 公式:

memory = 25 * R * C + F 

其中 R 是行数,C 是列数,F 是文件大小(以字节为单位)。

我的一个测试文件大小为 524 MB,在 4.4 中包含 10 列 万行。使用上面的公式,RAM 使用量约为 1.6 GB:

memory = 25 * 4,400,000 * 10 + 524,000,000 = 1,624,000,000 bytes

在 Tablecruncher 中打开此文件时,活动监视器 报告使用了 1.4 GB RAM,因此该公式代表了一个相当准确的 猜测。

【讨论】:

我可以使用chunck,但是如何使用其他大数据框架分析数据? 嗯,这完全取决于您到底需要做什么?如果可能的话,收集每个块的数据并在处理完所有块后聚合它。但这仅在您想分析某些关键值(例如数据的统计值)时才有效。【参考方案2】:

使用 chunk 部分读取数据。

dpath = 'p_flg_tmp1.csv'

for pdf in pd.read_csv(dpath, sep="|", chunksize=1000):
    *do something here*

【讨论】:

【参考方案3】:

您在这里的总体目标是什么?人们正在提供如何阅读它的帮助,但那又如何呢?你想加入/合并吗?你需要更多的技巧来度过难关。

然后呢?你的算法的其余部分也可以分块吗?你有足够的内存来处理任何东西吗?那么CPU性能呢?一个小i7够吗?您是否计划等待数小时或数天才能得出结果?当然,这对于您的用例来说可能都是可以接受的,但我们不知道。

在某个时候,如果您想使用大数据,您需要大型计算机。您真的必须在本地执行此操作吗?即使您还没有准备好在集群上进行分布式计算,您也可以获得一个足够大的 VM 实例。您的公司将为此付出代价。他们为自己买单。给你一台更好的电脑比付钱让你等一台小电脑完成要便宜得多。在印度,劳动力/AWS 成本之间的价格比当然低于美国,但仍然非常值得。就像嘿老板,你想要这需要 3 天还是 3 周?

实际上,在阅读 CSV 文件后,您的计算机小问题只会变得更糟。我的意思是我不知道你的用例,但这似乎很可能。您可能会花很长时间尝试设计解决这些问题的方法,但启动一个 EC2 实例要便宜得多。

【讨论】:

你是对的。我们无法在本地系统中处理更大的文件和大数据。我的用例应该是使用本地系统,直到大数据集群准备好进行数据分析。 好的,那么也许您的解决方案就是对数据进行下采样。现在使用大约 20% 的数据,这样您就可以开始使用您的算法,并在以后扩大规模。

以上是关于如何使用 python pandas 在本地系统 Jupyter Notebook 中读取两个较大的 5GB csv 文件?如何在本地加入两个数据框进行数据分析?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Apache-Spark - Python 在本地比 pandas 慢?

Pandas - 如何将 Parquet 数据帧保存到本地磁盘?

如何将 Parquet 文件读入 Pandas DataFrame?

如何使用 Python/Pandas 测量预测的准确性?

Python/Pandas/BigQuery:如何使用大量新的时间序列数据有效地更新现有表?

Spark:如何在每个执行程序中创建本地数据帧