2016-11-20 3 views
0

Предположим, у меня есть .txt-файл размером 9 ГБ. И я только хочу прочитать n-ый MB. (Я знаю, что такое n). Но мой компьютер имеет только 4 ГБ оперативной памяти, поэтому я не могу загрузить весь файл за один раз. Мне нужно получить доступ к разным n раз. Каков наилучший способ сделать это (я не знаю, сможет ли стандартный ifstream выполнить этот материал).Чтение больших файлов в C++

ответ

1

Вы хотите «искать» в файле в указанном месте. В C++ с использованием ifstream вы используете seekg(): http://www.cplusplus.com/reference/istream/istream/seekg/

Например:

char data[1024*1024]; 
ifstream in("myfile.txt"); 
in.seekg(450 * 1024 * 1024, ios_base::beg); // skip 450 MB 
if (in.read(data, sizeof(data)) { 
    // use data 
} 
+0

Просто помните, что 'символьные данные [1024 * 1024]' выделит 1 МБ на стек, который может создать проблемы в зависимости от вашего размер стека. Для более крупных распределений лучше использовать кучу. Для этого просто измените строку на 'char * data = new char [1024 * 1024]'. –

+1

@JosipVujcic: Я был с вами, пока вы не использовали 'new'. В C++ 14 мы можем использовать 'make_unique (1024 * 1024)'; в C++ 98 'std :: vector данные (1024 * 1024)'. –

+0

Я просто хотел указать на возможные проблемы и дать простое решение. Я согласен с вами в том, что использование интеллектуальных указателей (в C++ 14) - лучший способ сделать это. –

0

ли Вашей ОС 64-бит? Если да, попробуйте mmap().

На современных операционных систем, можно MMAP (произносится «эм-карту») файл в области памяти. Когда это будет сделано, к файлу можно получить доступ, как к массиву в программе.

Это более эффективно, чем чтение или запись, так как загружаются только области файла , к которому обращается программа. Доступ к незагруженным частям mmapped области обрабатываются таким же образом как помененные страницы.

Так как mmapped-страницы могут быть сохранены в их файле, когда физическая память низкая, возможно, mmap-файлы на порядок больше , чем как физическая память, так и пространство подкачки. Единственный предел - адресное пространство. Теоретический предел составляет 4 ГБ на 32-битной машине - , однако фактический предел будет меньше, поскольку некоторые области будут зарезервированы для других целей. Если используется интерфейс LFS, размер файла на 32-битных системах не ограничивается 2 ГБ (смещения подписаны, а уменьшает адресную область на 4 ГБ вдвое); полные 64-разрядные версии: .

Карты памяти работают только на целых страницах памяти. Таким образом, адреса для отображения должны быть выровнены по страницам, а значения длины округлены вверх.

Подробнее: