Я был вдохновлен пакетом fst
, чтобы попытаться написать функцию C++, чтобы быстро сериализовать некоторые структуры данных, которые у меня есть на R на диск.
Но у меня возникают проблемы с достижением одной и той же скорости записи даже на очень простых объектах. Нижеприведенный код - простой пример написания большого 1 ГБ вектора на диск.
Используя специальный код C++, я достигаю скорость записи 135 МБ/с, что является пределом моего диска в соответствии с CrystalBench.
По тем же данным write_fst
достигает скорости записи 223 МБ/с, что кажется невозможным, так как мой диск не может писать так быстро. (Обратите внимание: я использую fst::threads_fst(1)
и compress=0
, а файлы имеют одинаковый размер данных.)
Что мне не хватает?
Как я могу заставить функцию C++ быстрее записывать на диск?
C++ Код:
#include <Rcpp.h>
#include <fstream>
#include <cstring>
#include <iostream>
// [[Rcpp::plugins(cpp11)]]
using namespace Rcpp;
// [[Rcpp::export]]
void test(SEXP x) {
char* d = reinterpret_cast<char*>(REAL(x));
long dl = Rf_xlength(x) * 8;
std::ofstream OutFile;
OutFile.open("/tmp/test.raw", std::ios::out | std::ios::binary);
OutFile.write(d, dl);
OutFile.close();
}
R Код:
library(microbenchmark)
library(Rcpp)
library(dplyr)
library(fst)
fst::threads_fst(1)
sourceCpp("test.cpp")
x <- runif(134217728) # 1 gigabyte
df <- data.frame(x)
microbenchmark(test(x), write_fst(df, "/tmp/test.fst", compress=0), times=3)
Unit: seconds
expr min lq mean median uq max neval
test(x) 6.549581 7.262408 7.559021 7.975235 8.063740 8.152246 3
write_fst(df, "/tmp/test.fst", compress = 0) 4.548579 4.570346 4.592398 4.592114 4.614307 4.636501 3
file.info("/tmp/test.fst")$size/1e6
# [1] 1073.742
file.info("/tmp/test.raw")$size/1e6
# [1] 1073.742