我正在开发一个程序,该程序将处理可能大小为100GB或更大的文件.这些文件包含一组可变长度记录.我已经启动并运行了第一个实现,现在我正在寻求提高性能,特别是在输入文件被多次扫描时更有效地进行I/O.
mmap()通过C++的fstream库使用和读取块有经验吗?我想做的是从磁盘读取大块到缓冲区,从缓冲区处理完整记录,然后阅读更多.
该mmap()代码可能会变得非常凌乱,因为mmap"d块需要躺在页大小的边界(我的理解)和记录可能潜在般划过页面边界.使用fstreams,我可以寻找记录的开头并再次开始阅读,因为我们不仅限于阅读位于页面大小边界的块.
如何在不实际编写完整实现的情况下决定这两个选项?任何经验法则(例如,mmap()快2倍)或简单测试?
有很多关于如何读取多个CSV并将它们绑定到一个数据帧的文档.我有5000多个CSV文件需要读入并绑定到一个数据结构中.
特别是我在这里的讨论:使用rbind将多个.csv文件加载到R中的单个数据帧中的问题
奇怪的是,基础R比我尝试过的任何其他解决方案都要快得多.
这是我的CSV的样子:
> head(PT)
Line Timestamp Lane.01 Lane.02 Lane.03 Lane.04 Lane.05 Lane.06 Lane.07 Lane.08
1 PL1 05-Jan-16 07:17:36 NA NA NA NA NA NA NA NA
2 PL1 05-Jan-16 07:22:38 NA NA NA NA NA NA NA NA
3 PL1 05-Jan-16 07:27:41 NA NA NA NA NA NA NA NA
4 PL1 05-Jan-16 07:32:43 9.98 10.36 10.41 10.16 10.10 9.97 10.07 9.59
5 PL1 05-Jan-16 07:37:45 9.65 8.87 9.88 9.86 8.85 8.75 9.19 8.51
6 PL1 05-Jan-16 …Run Code Online (Sandbox Code Playgroud) 通过网络我可以读到我应该使用data.table和fread来加载我的数据.
但是当我运行基准测试时,我得到以下结果
Unit: milliseconds
expr min lq mean median uq max neval
test1 1.229782 1.280000 1.382249 1.366277 1.460483 1.580176 10
test3 1.294726 1.355139 1.765871 1.391576 1.542041 4.770357 10
test2 23.115503 23.345451 42.307979 25.492186 57.772522 125.941734 10
Run Code Online (Sandbox Code Playgroud)
代码可以在下面看到.
loadpath <- readRDS("paths.rds")
microbenchmark(
test1 = read.csv(paste0(loadpath,"data.csv"),header=TRUE,sep=";", stringsAsFactors = FALSE,colClasses = "character"),
test2 = data.table::fread(paste0(loadpath,"data.csv"), sep=";"),
test3 = read.csv(paste0(loadpath,"data.csv")),
times = 10
) %>%
print(order = "min")
Run Code Online (Sandbox Code Playgroud)
我明白这fread()应该比read.csv()因为它试图首先将行作为字符读入内存然后尝试将它们转换为整数和因子作为数据类型而更快.另一方面,fread()简单地将所有内容都读作字符.
如果这是真的,不test2应该快于test3?
有人可以解释我,我为什么不archieve一个加速或者至少相同的速度test2为test1 …