代码之家  ›  专栏  ›  技术社区  ›  Peter Chen

python块大小差异

  •  -1
  • Peter Chen  · 技术社区  · 3 年前

    我有一个关于使用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)
    

    是否存在性能差异?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Icarwiz    3 年前

    当你对效率有疑问时,正如@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才有用。

    这个想法是为了避免你的电脑内存以任何方式过载。

    在这里,再次进行测试:如果你有16Gb的内存,创建一个 str 通过重新感染,直到你的记忆充满的那一刻。一旦你到达那里,你的电脑性能就会急剧下降!

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

    在Jupyter下:

    a = 'a'*1_000_000_000
    

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

    a += 'a'*1_000_000_000
    

    自己看看…:)