本主题(快速读取非常大的表作为数据帧(调查相同的问题,但不是通过循环。我有 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 的文本文件是相当大的数据,需要大量的努力来加快处理速度或大量的等待时间。没有简单的方法可以绕过;)
- 您需要将数据放入内存才能开始任何工作
- 从单个硬盘驱动器读取文件时,逐个(不是并行(读取文件的速度最快
- 测量在不解析的情况下加载数据所需的时间
- 多个类似文件的加载时间将只是单个文件时间的倍数,您无法在这里获得任何神奇的改进
- 为了缩短加载时间,您可以压缩输入文件 - 仅当您多次使用相同的数据源时才需要付费(压缩后,必须越过硬盘驱动器 ->内存边界的字节更少,这很慢(
- 选择如何压缩数据时,目标是加载(压缩(+解压缩时间小于加载(解压缩(
- 您需要解析原始数据
- 测量解析数据所需的时间
- 如果无法分离解析,请测量加载和解析数据所需的时间,则解析时间是与先前测量的加载时间的差值
- 解析可以并行化,但只有当这是加载时间的很大一部分时,它才有意义
- 你需要做你的事
- 这通常可以并行完成
- 您需要保存结果
- 除非结果和输入一样大,否则你不在乎
- 如果它们很大,则需要再次序列化您的 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
快得多(。