在Pandas Dataframe中读取大文件文本文件的最佳方法

问题描述 投票:0回答:1

我有几个大文件(每个> 4 GB)。其中一些采用固定宽度格式,另一些采用管道定界。这些文件具有数字和文本数据。目前,我正在使用以下方法:

df1 = pd.read_fwf(fwFileName, widths = [2, 3, 5, 2, 16], 
                 names = columnNames, dtype = columnTypes,
                 skiprows = 1, engine = 'c', 
                 keep_default_na = False)
df2 = pd.read_csv(pdFileName, sep = '|', names = columnNames, 
                 dtype = columnTypes, useCols = colNumbers, 
                 skiprows = 1, engine = 'c', 
                 keep_default_na = False)

但是,这似乎比R的read_fwf(来自readr)和fread(来自data.table)慢。我可以使用其他方法来加快读取这些文件的速度吗?

我正在大型服务器上工作,因此内存不是问题。我可以安全地将整个文件加载到内存中。

python pandas csv large-files fixed-width
1个回答
0
投票

由于这里我们将时间作为度量标准,所以您的内存大小不是我们应该关注的主要因素,实际上,所有使用延迟加载的方法(较少的内存,仅在需要时才加载对象)要快得多与一次将所有数据加载到内存中相比,您可以签出dask,因为它提供了这种惰性读取功能。 https://dask.org/

start_time = time.time() 
data = dask.dataframe.read_csv('rg.csv') 
duration = time.time() - start_time
print(f"Time taken {duration} seconds") # less than a second

但是正如我说的那样,这不会在内存中加载数据,而是在需要时仅加载部分数据,但是您可以使用以下命令将其全部加载:

data.compute()

[如果您想更快地将内容加载到内存中,那么您需要在服务器中具有良好的计算能力,ParaText https://github.com/wiseio/paratext是可以从此类功能中受益的不错的人选您可以使用以下代码针对readcsv对ParaText进行基准测试:

import time
import paratext
start_time = time.time() 
df = paratext.load_csv_to_pandas("rg.csv") 
duration = time.time() - start_time
print(f"Time taken {duration} seconds")   
import time
import pandas as pd
start_time = time.time() 
df = pd.read_csv("rg.csv") 
duration = time.time() - start_time
print(f"Time taken {duration} seconds")   

请注意,如果您没有足够的计算能力来支持paraText,结果可能会更糟。您可以在此处查看ParaText加载大文件的基准https://deads.gitbooks.io/paratext-bench/content/results_csv_throughput.html

© www.soinside.com 2019 - 2024. All rights reserved.