Быстрый способ записи пар int-double в двоичный файл на диске - PullRequest
0 голосов
/ 07 апреля 2020

Что я пробовал:

#include <Rcpp.h>
#include <fstream>

using namespace Rcpp;
using namespace std;

// [[Rcpp::export]]
void write_indval(const char * filename,
                  const IntegerVector& i,
                  const NumericVector& x) {

  ofstream myFile(filename, ios::out | ios::binary);

  const int * pI = i.begin();
  const double * pX = x.begin();
  int K = i.size();

  for (int k = 0; k < K; k++, pI++, pX++) {
    myFile.write(reinterpret_cast<const char*>(pI), 4);
    myFile.write(reinterpret_cast<const char*>(pX), 8);
  }

  myFile.close();
}

Если я попробую это в R:

N <- 1e8
i <- sample(1000, N, replace = TRUE)
x <- runif(N)
system.time(
  write_indval("test.bin", i, x)
)

Для записи данных объемом 1,1 ГБ потребуется 16 секунд. Кажется, что записанные данные - то, что я хочу, но я пишу со скоростью 72 МБ / с c. Я думаю, что я могу написать на 300 МБ / с c на моем компьютере. Итак, кто-нибудь знает более быструю альтернативу этой функции?

...