将几个巨大的.txt文件通过循环读取到 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快得多(。

最新更新