У меня есть очень большой текстовый файл (45 ГБ). Каждая строка текстового файла содержит два 64-битных целых числа без знака, разделенных пробелами, как показано ниже.
4624996948753406865 10214715013130414417
4305027007407867230 4569406367070518418
10817905656952544704 3697712211731468838 ... ...
Я хочу прочитать файл и выполнить некоторые операции с числами.
Мой код на С++:
void process_data(string str)
{
vector<string> arr;
boost::split(arr, str, boost::is_any_of(" \n"));
do_some_operation(arr);
}
int main()
{
unsigned long long int read_bytes = 45 * 1024 *1024;
const char* fname = "input.txt";
ifstream fin(fname, ios::in);
char* memblock;
while(!fin.eof())
{
memblock = new char[read_bytes];
fin.read(memblock, read_bytes);
string str(memblock);
process_data(str);
delete [] memblock;
}
return 0;
}
Я относительно новичок в С++. Когда я запускаю этот код, я сталкиваюсь с этими проблемами.
Из-за чтения файла в байтах иногда последняя строка блока соответствует незавершенной строке исходного файла («4624996948753406865 10214» вместо фактической строки «4624996948753406865 10214715013130414417» основного файла).
Этот код работает очень-очень медленно. Выполнение операций с одним блоком в 64-битной системе Intel Core i7 920 с 6 ГБ ОЗУ занимает около 6 секунд. Существуют ли какие-либо методы оптимизации, которые я могу использовать для улучшения времени выполнения?
Нужно ли включать «\n» вместе с пустым символом в функцию разделения усиления?
Я читал о файлах mmap в С++, но я не уверен, что это правильный способ сделать это. Если да, пожалуйста, прикрепите несколько ссылок.
eof
не очень хорошо. - person molbdnilo   schedule 04.11.2014libstdc++
) - person Basile Starynkevitch   schedule 04.11.201420*8=160
bytes для хранения, например. число4624996948753406865
+ пробел, а всего 8 байт - person Gunther Struyf   schedule 28.04.2017