繁体   English   中英

将几个巨大的 .txt 文件 OVER LOOP 读入 r 的最快方法

[英]The fastest way to to read several huge .txt files OVER LOOP into r

本主题(将非常大的表作为数据帧快速读取)调查了相同的问题,但不是在循环中。 我有 1000 个不同的.txt 文件,每个 200 mb 有 100 万行。 那么在循环中读取它们的最快方法是什么?

我已经针对 10 个文件的案例报告的计算时间练习了以下方法。

for (i in 1:10){
x<- read.delim()
# do something
}
# Time : 89 sec

for (i in 1:10){
x<- read.table()
# do something
}
# Time : 90 sec 

for (i in 1:10){
x <- fread()
# do something
}
# Time : 108  sec . !!!! (to my knowledge it is supposed to be the fastest, but when it comes to loop it is not the fastest though)!

foreach (i in 1:10)%dopar{
x<- read.delim()
# do something
}

# Time: 83 sec

foreach(i in 1:10) %dopar{
x <- fread()
# do something
}

# Time: 95 sec

有人告诉我 disk.frame() 包是最快的。 还不能尝试。 需要你的想法,请。 可以应用 Laapply 来加快流程吗?

也许 lapply() 可以帮助,正如你所建议的

myFiles <- list.files(pattern="txt$")
myList <- lapply(myFiles, function(x) fread(x))

我也很惊讶 fread 需要比 read.table 更长的时间。 当我有大文件时,fread 确实有助于更快地读取它们。

我添加这个作为答案以获得比评论更多的空间。

使用“大数据”快速工作

200 GB 的文本文件是相当大的数据,需要付出大量努力来加快处理速度或等待大量时间。 没有简单的方法;)

  1. 您需要将数据存入内存才能开始任何工作
    • 从单个硬盘驱动器读取时,一个一个(不是并行)读取文件是最快的
    • 测量在不解析的情况下加载数据所需的时间
    • 您加载多个类似文件的时间将只是单个文件时间的倍数,您无法在这里获得任何神奇的改进
    • 为了缩短加载时间,您可以压缩输入文件 - 只有当您多次使用相同的数据源时才值得(压缩后,必须穿过硬盘驱动器的字节更少 -> 内存边界,这很慢)
    • 在选择如何压缩数据时,您的目标是加载(压缩)+解压缩时间小于加载(解压缩)
  2. 你需要解析原始数据
    • 测量解析数据所需的时间
    • 如果你不能分开解析,测量加载和解析数据需要多少时间,解析时间就是之前测量的加载时间的差异
    • 解析可以并行化,但只有当这是加载时间的重要部分时才有意义
  3. 你需要做你的事
    • 这通常可以并行完成
  4. 你需要保存结果
    • 除非结果和输入一​​样大,否则你不在乎
    • 如果它们很大,您需要再次序列化您的 IO,即一一保存,而不是并行保存
    • 再次压缩有帮助,如果您选择压缩时间 + 写入时间小于未压缩数据的写入时间的算法和设置

要获得原始加载时间, bash是您的朋友。 使用pipe viewer或内置time您可以通过执行以下操作轻松检查读取文件所需的时间

pv mydata.txt > /dev/null

# alternatively
time cat mydata.txt > /dev/null

请注意,当您重复测量单个文件时,您的磁盘缓存将启动。

至于压缩,如果您坚持使用 R, gzip是唯一合理的选择。 如果您要在bash进行一些预处理,则lz4是首选工具,因为它在适当的压缩比下非常快。

gzip -3 mydata.txt
pv mydata.txt.gz | zcat > /dev/null

在这里,我们开始进行预处理。 使用 UNIX 工具在加载到 R 之前对数据进行预处理往往非常快是值得的。您可以使用cut过滤列,使用mawk过滤行(这通常比gawk快得多)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM