Как читать блоки данных из файла, а затем читать из этого блока в вектор?



Предположим, что у меня есть файл с записями X. Один "блок" содержит m записей. Общее количество блоков в файле n=x/m. если я знаю размер одной записи, скажем b байт (размер одного блока = b*m), я могу прочитать весь блок сразу, используя системную команду read () (есть ли какой-либо другой метод?). Теперь, как мне прочитать каждую запись из этого блока и поместить каждую запись как отдельный элемент в вектор.



Причина, по которой я хочу сделать это в первую очередь, заключается в сокращении операций ввода-вывода диска. Как операции дискового ввода-вывода намного дороже, согласно тому, что я узнал.
Или это займет столько же времени, сколько когда я читаю запись за записью из файла и непосредственно помещаю ее в векторы вместо чтения блок за блоком? При чтении блок за блоком у меня будет только n дисковых входов/выходов, тогда как x входов/выходов, если я читаю запись за записью.



Спасибо.

596   2  

2 ответов:

Вы должны рассмотреть возможность использования mmap() вместо чтения файлов используйте read().

Что хорошо в mmap, так это то, что вы можете рассматривать содержимое файла как просто отображенное в пространство процесса, как если бы у вас уже был указатель на содержимое файла. Просто проверяя содержимое памяти и обрабатывая его как массив, или копируя данные с помощью memcpy(), Вы будете неявно выполнять операции чтения, но только по мере необходимости-подсистема виртуальной памяти операционной системы достаточно умна, чтобы сделать это очень эффективно.

Единственная возможная причина избегать mmap, возможно, если вы работаете на 32-битной ОС и размер файла превышает 2 гигабайта (или чуть меньше). В этом случае у ОС могут возникнуть проблемы с выделением адресного пространства для вашей памяти mmap-ed. Но на 64-битной ОС использование mmap никогда не должно быть проблемой.

Кроме того, mmap может быть громоздким, если вы пишете много данных, а размер данных заранее не известен. Кроме того, всегда лучше и быстрее использовать его над read.

На самом деле большинство современных операционных систем широко полагаются на mmap. Например, в Linux, чтобы выполнить некоторый двоичный файл, ваш исполняемый файл просто mmap-ed и выполняется из памяти, как если бы он был скопирован туда read, без фактического reading его.

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

Все еще возможно, что чтение блока за один раз уменьшит количество операций ввода-вывода. Если ваш блок больше, чем буфер, используемый потоком по умолчанию, то вы ожидайте увидеть меньше операций ввода-вывода, используемых для чтения данных. С другой стороны, вы можете сделать то же самое, просто регулируя размер буфера, используемого потоком (что, вероятно, намного проще).

Comments

    Ничего не найдено.