Считывание данных непосредственно из файла в оперативную память на C ++

StackOverflow https://stackoverflow.com/questions/1086254

  •  23-08-2019
  •  | 
  •  

Вопрос

Есть ли способ напрямую прочитать двоичный файл в оперативную память?

Я имею в виду, есть ли способ сообщить компилятору, вот файл, вот блок оперативной памяти, пожалуйста, поместите содержимое файла в оперативную память, приступайте, как можно быстрее, пожалуйста.

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

Как относительный новичок в этом, я, возможно, имею совершенно неправильное представление об этом - любое руководство было бы большим подспорьем.

Мне просто нужен самый быстрый способ поместить большой файл в оперативную память.

Спасибо

Это было полезно?

Решение

Что мешает вам прочитать файл за один проход?Он слишком большой, чтобы поместиться в памяти?

Вы также можете использовать сопоставленный файл, UNIX :mmap, Windows :Сопоставление файлов для создания

Другие советы

Я думаю, что то, что вам нужно, это файл, отображенный в памяти, однако API зависит от того, на какой ОС вы работаете, в UNIX, я полагаю, это mmap().

mmap должно сработать на вас.Большинство реализаций фактически не читают файл, пока вы не обратитесь к фактическим страницам памяти, но в любом случае вы можете получить доступ к содержимому файла, как если бы оно постоянно находилось в оперативной памяти.

Вы не говорите, на какой платформе вы находитесь, но это звучит как задание для файлов, отображенных в памяти.

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

Я не уверен, что это то, о чем вы просите, но для ускорения чтения из файла вы могли бы буферизировать больше байтов.второй аргумент метода read() fstream может быть установлен для указания размера входных данных.присвоение ему, например, значения 32k (32* (2 ^ 10)) может ускорить процесс чтения.Я предлагаю вам провести некоторый бенчмаркинг с другим размером буфера.

Если вы имеете в виду "избегать помещения файла в swap и ВСЕГДА помещать его в оперативную память", я думаю, вы можете, поскольку об этом заботится ОС.

Посмотрите на пример ContentStreaming в DirectX SDK.

Он использует подход сопоставления файлов.Очевидно, что он использует Windows API, но вы можете найти соответствующий API и для других платформ.

Интересно то, что это показывает вам подход в контексте.(Считывание / подкачка по частям огромной модели (в данном случае terrain) по запросу

Boost, помимо прочего, обеспечивает кроссплатформенную поддержку файлов, сопоставленных с памятью...

Увеличьте объем файлов, отображенных в памяти

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top