【问题标题】:python chunksize differencepython块大小差异
【发布时间】:2021-03-10 20:30:31
【问题描述】:

我有一个关于使用 chunksize 读取大型 csv 文件的问题。
我的问题是:下面这两者有什么区别?

import pandas as pd
chunks = pd.read_csv("large_data.csv", chunksize=1000000)
chunk_list = []  

# Each chunk is in dataframe format
for data_chunk in chunks:  
    filtered_chunk = chunk_filtering(data_chunk)
    chunk_list.append(filtered_chunk)
    
final = pd.concat(chunk_list)
chunks = pd.read_csv("large_data.csv", chunksize=1000000)
final = pd.concat(chunks)

有什么性能差异吗?

【问题讨论】:

  • 你测试了吗?两者根本不同,因为一个被过滤,另一个没有。过滤可以删除所有数据的 99% ....
  • 如果你将它们添加到一个 pd 中,为什么要分块读取 - 这样做有什么好处吗?以某种方式怀疑它 - 但这只是一种预感。
  • @PatrickArtner 我可以直接导入它,但我只是好奇为什么其他人建议使用chunksize
  • 如果你有一个 10GB 的 CSV 文件和一台有 8GB 内存的电脑,你不能在你的内存中填满所有的数据。使用 chunksize 可以避免这种情况 - 如果您最终尝试使用 chunksize 将 ALL 加载到您的 ram 中而不对数据进行任何过滤 - 您最终会遇到与不使用它相同的问题:它不适合。但是,如果您过滤数据并说过滤后仅剩下 10GB 文件中的 1GB,使用块将使其变得更平滑,因为您只在数据框中保存那些重要的数据项(小于 1GB)加上额外的 1 兆字节要过滤的原始 csv 数据块。

标签: python pandas chunks


【解决方案1】:

当您对效率有疑问时,正如@Patrick Artner 建议的那样,只需测试一下即可:

start = time.perf_counter()
final = pd.read_csv("large_data.csv")
print(time.perf_counter() - start)
start = time.perf_counter()
final = pd.concat(pd.read_csv("large_data.csv", chunksize=1_000_000))
print(time.perf_counter() - start)

或者,如果您使用的是 Jupyter:

%%timeit
final = pd.read_csv("large_data.csv")

但你的问题的答案是:使用 chunksize 和 concat 显然会比直接使用慢。

只有当您像处理过滤器一样处理数据时,chunksize 才有用。

这个想法是为了避免您的计算机内存以任何方式过载。

再次在这里进行测试:如果您有 16 Gb 的内存,则通过重新影响您的内存已满的那一刻来创建一个 str。一旦到达那里,您的计算机性能就会急剧下降!

所以我们处理的块足够小,可以在计算机内存限制内进行处理...

在 Jupyter 下:

a = 'a'*1_000_000_000

在查看您的内存使用情况时运行以下单元格:

a += 'a'*1_000_000_000

你自己看看... :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2019-08-11
    相关资源
    最近更新 更多