Desidero leggere i dati da un file .bz. Sto cercando di farlo usando rcpp plus boost usando la libreria BH. Sto usando R 3.2.0 su MacOSX 10.10.3, Rcpp versione 0.11.6 e BH 1.58.0-1.rcpp non vengono caricati con la libreria boost (come implementato in BH) quando si utilizza boost :: iostreams :: gzip_decompress
Ecco il mio codice finora:
// [[Rcpp::depends(BH)]]
#include <Rcpp.h>
#include <iostream>
#include <fstream>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/math/common_factor.hpp>
using namespace Rcpp;
// [[Rcpp::export]]
int read_file_cpp(std::string path) {
std::ifstream file(path.c_str(), std::ios_base::in | std::ios_base::binary);
boost::iostreams::filtering_istream in;
in.push(boost::iostreams::gzip_decompressor());
in.push(file);
for(std::string str; std::getline(in, str);)
{
std::cout << "Processed line " << str << '\n';
}
file.close();
return(0);
}
Quando provo a caricare il codice tramite:
Rcpp::sourceCpp(file = "src/boost_test.cpp")
ottengo il seguente errore:
Error in dyn.load("/var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so") : unable to load shared object '/var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so': dlopen(/var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so, 6): Symbol not found: __ZN5boost9iostreams6detail11gzip_footer5resetEv Referenced from: /var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so Expected in: flat namespace in /var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so
Per qualche risoluzione dei problemi , la linea problematica sembra essere:
in.push(boost::iostreams::gzip_decompressor());
In particolare, gzip_decompressor()
sembra essere la causa principale. Se provo il gzip_compressor()
, invece il programma funziona bene (eccetto che ho solo un bindo binario sullo schermo).
Guardando attraverso il codice BH, ho confermato che il codice gzip_decompressor
è dove dovrebbe essere.
Grazie per qualsiasi aiuto.
UPDATE
Seguendo i suggerimenti da Dirk e nrussell, questo è come ho risolto il problema.
Boost scaricato da here.
Leggere le istruzioni here.
Unpacked, e corse il seguente:
./bootstrap.sh --help
Leggere le istruzioni, e ho deciso che solo bisogno di compilare iostreams. Così, corse il seguente:
./bootstrap.sh --with-libraries=iostreams
./b2
capito il percorso in cui il compilatore cerca le librerie. Sono sicuro che ci sia un modo più intelligente di farlo, ma mi sono imbattuto il seguente dal prompt R:
Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
Dal testo che segue, ha notato che '/ usr/local/lib' era nel percorso. Così, dal prompt dei comandi, ho creato un link alla libreria nel percorso corretto:
ln -s /Users/andersgs/Downloads/boost_1_58_0/stage/lib/libboost_iostreams.dylib /usr/local/lib/
Ciò, ovviamente, devono essere corretti in seguito, in quanto non sarà alloggiato nella mia cartella Download.
Quindi, ha seguito le istruzioni di Dirk, con la raccomandazione di nrussell. Quindi, di nuovo in R:
Sys.setenv("PKG_LIBS"="-lboost_iostreams")
Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
successo !!! Compilato correttamente Funziona anche
Grazie ad entrambi.
Anders.
Basandosi sulla risposta di @Dirk Eddelbuettel, probabilmente si deve passare '-lboost_iostreams' al compilatore. – nrussell