Управление данными в памяти вместо файла - PullRequest
1 голос
/ 10 июля 2010

рассмотрим функцию ниже:

int Func(char* filename);
int Func(FILE* filepointer);

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

Можно ли каким-либо образом избавиться от данных сохранения / загрузки?например, путем создания указателя FILE *, который указывает где-то в памяти?

Обновление: очевидно, у меня нет исходного кода Func!Это вызов DLL.

Ответы [ 2 ]

2 голосов
/ 10 июля 2010

Вы можете использовать метод сопоставления памяти или что-то вроде boost :: iostreams с пользовательскими приемниками / источниками памяти.

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

0 голосов
/ 10 июля 2010

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

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

Для определенного объема ОЗУ, выделенного для буферизации, вы можете получить более высокую производительность (как на уровне приложения выглядитогромное количество крошечных операций записи и чтения), если это ОЗУ находится в пользовательском пространстве в адресном пространстве вашего приложения (а не под контролем ядра, например, в tmpfs), просто потому, что вам потребуется меньше переключений контекста - и переключается с режима пользователя на режим ядра иback имеют тенденцию доминировать во время выполнения, когда единственными другими выполняемыми операциями являются копии небольшого количества памяти назад и вперед.Когда вы используете очень большие буферы в библиотеке stdio вашего приложения, ваш «I / O» составляет копии пользовательской памяти в пределах вашего адресного пространства с очень редкими «потоковыми» операциями, которые фактически передают эти буферы туда и обратно.

...