Ho un file con il seguente formato:modo più efficace per analizzare ogni quarta riga da un file molto grande
1: some_basic_info_in_this_line
2: LOTS_OF_INFO_IN_THIS_LINE_HUNDREDS_OF_CHARS
3: some_basic_info_in_this_line
4: LOTS_OF_INFO_IN_THIS_LINE_HUNDREDS_OF_CHARS
...
che il formato si ripete decine di migliaia di volte, rendendo i file fino a 50 GB +. Ho bisogno di un modo efficiente per elaborare l'unica linea 2 di questo formato. Sono aperto all'utilizzo di C, C++ 11 STL o boost. Ho esaminato varie altre domande riguardanti lo streaming di file su SO, ma mi sento come se la mia situazione fosse unica a causa delle grandi dimensioni del file e richiedendone solo una su ogni quattro righe.
La mappatura della memoria del file sembra essere la più efficiente da ciò che ho letto, ma mappare un file di 50+ GB si esaurirà nella maggior parte dei computer RAM (si può presumere che questa applicazione verrà utilizzata da utenti "medi" - dire 4-8 GB RAM). Inoltre ho solo bisogno di elaborare una delle linee alla volta. Ecco come Attualmente sto facendo questo (sì sono consapevole che non è efficiente, è per questo che sto ridisegnare esso):
std::string GL::getRead(ifstream& input)
{
std::string str;
std::string toss;
if (input.good())
{
getline(input, toss);
getline(input, str);
getline(input, toss);
getline(input, toss);
}
return str;
}
sta rompendo la mmap in blocchi la risposta per la mia situazione? C'è comunque che io possa sfruttare solo il bisogno di 1 su 4 linee? Grazie per l'aiuto.
Ancora una volta, mi chiedo chi ha downvoted questo. È una domanda abbastanza interessante ed è ben posta. +1 – sehe
Se il formato è strettamente definito con le dimensioni delle linee, è possibile utilizzare input.seekg per saltare le righe indesiderate – Nir
Il collo di bottiglia principale si troverà nell'operazione di input. Ti suggerisco di sperimentare vari modi per caricare i dati in blocco per blocco sul computer di un utente tipico. Non sei sicuro di come gestire al meglio una linea che si trova a cavallo di due blocchi (ci sarà una tale linea per la maggior parte dei blocchi). –