【问题标题】:Fastest way to read large files text files in Pandas Dataframe在 Pandas Dataframe 中读取大文件文本文件的最快方法
【发布时间】:2020-04-14 02:40:14
【问题描述】:

我有几个大文件(每个文件 > 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)慢。我可以使用其他一些方法来帮助加快读取这些文件的速度吗?

我正在使用具有多个内核的大型服务器,因此内存不是问题。我可以安全地将整个文件加载到内存中。也许在这种情况下它们是相同的,但我的目标是按时间而不是资源进行优化。

更新

根据迄今为止的 cmets,这里有一些关于数据和我的最终目标的额外细节。

  • 这些文件被压缩(固定宽度为 zip,管道分隔为 gzip)。因此,我不确定像 Dask 这样的东西是否会增加加载的价值。他们会吗?
  • 加载这些文件后,我计划将计算量大的函数应用于数据组。因此,我需要全部数据。尽管数据是按组排序的,即前 x 行是第 1 组,接下来的 y 行是第 2 组,依此类推。因此,即时组建小组可能更有效率?考虑到我不知道每个组预期有多少行,有没有一种有效的方法?

【问题讨论】:

  • 你可以使用dask

标签: python pandas csv large-files fixed-width


【解决方案1】:

由于我们在这里将时间作为衡量标准,因此您的内存大小不是我们应该关注的主要因素,实际上相反,所有使用延迟加载的方法(更少的内存并且仅在需要时加载对象)要多得多比一次在内存中加载所有数据更快,您可以查看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()

如果你想在内存中更快地加载东西,那么你的服务器需要有良好的计算能力,可以从这些能力中受益的一个很好的候选人是ParaTexthttps://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.

【讨论】:

  • 感谢您的回答。我希望能够对这些数据组执行计算。因此,除了将完整数据加载到内存中之外,我认为我别无选择。我会试一试,让你知道。 ParaText 看起来很有趣,但我不确定它目前是否支持固定宽度的文件。
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多