gpt4 book ai didi

r - 快速读取非常大的表作为数据框

转载 作者:行者123 更新时间:2023-12-02 05:27:35 26 4
gpt4 key购买 nike

我有非常大的表(3000 万行),我想将其作为 R 中的数据帧加载。read.table() 有很多方便的功能,但似乎有实现中的大量逻辑会减慢速度。就我而言,我假设我提前知道列的类型,该表不包含任何列标题或行名称,并且没有任何我必须担心的病态字符。

我知道使用 scan() 将表格作为列表读取可能会非常快,例如:

datalist <- scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0)))

但是我将其转换为数据帧的一些尝试似乎将上述性能降低了 6 倍:

df <- as.data.frame(scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0))))

有更好的方法吗?或者很可能完全不同的解决问题的方法?

最佳答案

几年后的更新

这个答案已经过时了,R 已经继续前进。调整 read.table 跑得快一点几乎没有什么好处。您的选择是:

  1. 使用 vroom 来自 tidyverse 包 vroom用于将数据从 csv/制表符分隔文件直接导入到 R tibble 中。请参阅Hector's answer .

  2. 使用 fread data.table 用于将 csv/制表符分隔文件中的数据直接导入到 R 中。请参阅 mnel's answer .

  3. 使用 read_table readr (2015 年 4 月 CRAN 上)。这很像 fread多于。链接中的自述文件解释了两个函数之间的差异( readr 目前声称比 data.table::fread “慢 1.5-2 倍”)。

  4. read.csv.raw 来自 iotools 提供了第三个选项来快速读取 CSV 文件。

  5. 尝试在数据库而不是平面文件中存储尽可能多的数据。 (除了作为更好的永久存储介质之外,数据以二进制格式传入和传出 R,速度更快。) read.csv.sql sqldf 包,如 JD Long's answer 中所述,将数据导入到临时 SQLite 数据库中,然后将其读入 R。另请参阅: RODBC 包,以及 DBI package 的反向依赖部分页。 MonetDB.R 为您提供一种假装是数据框架但实际上是 MonetDB 的数据类型,从而提高了性能。使用 monetdb.read.csv 导入数据功能。 dplyr 允许您直接处理存储在多种类型数据库中的数据。

  6. 以二进制格式存储数据也有助于提高性能。使用saveRDS/readRDS (见下文), h5 rhdf5 HDF5 格式的软件包,或 write_fst/read_fst来自 fst 包。

<小时/>

原答案

无论您使用 read.table 还是 scan,都可以尝试一些简单的操作。

  1. 设置nrows =数据中的记录数(nmax in scan)。

  2. 确保 comment.char=""关闭评论解释。

  3. 使用 colClasses 显式定义每列的类在read.table .

  4. 设置multi.line=FALSE还可以提高扫描性能。

如果这些都不起作用,则使用 profiling packages 之一以确定哪些线路正在减慢速度。也许你可以写一个 read.table 的精简版本根据结果​​。

另一种选择是在将数据读入 R 之前对其进行过滤。

或者,如果问题是您必须定期读取数据,则使用这些方法一次性读取数据,然后使用 save 将数据帧保存为二进制 blob saveRDS ,那么下次您可以使用 load 更快地检索它 readRDS .

关于r - 快速读取非常大的表作为数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1727772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com