Как сделать так, чтобы C-массив всегда был доступен с диска напрямую, а не оставался в памяти? - PullRequest
2 голосов
/ 02 февраля 2012

Я пытаюсь встроить двоичные медиа-ресурсы в исходный код.Я собираюсь использовать простой C-массив (char[]) для хранения бинарных файлов.(с чем-то вроде этого: Встраивание двоичных двоичных объектов с использованием gcc mingw ) Поскольку управление ресурсом медиа-файлов по отдельности очень раздражает, потому что этот символ трудно определить во время компиляции, и это раздражает и моих клиентов.

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

  1. он является частью кода
  2. и является константой.

Я не знаю никакой опциичтобы удалить его из памяти.

Как мне разрешить постоянный доступ к массиву C с диска напрямую, а не оставаться в памяти?

PS.Я могу строго ограничить свою среду сборки и исполнения.Я буду использовать Clang, и программа будет работать на iOS.В любом случае, я не против использовать какой-либо дополнительный инструмент для сборки:)

Ответы [ 4 ]

4 голосов
/ 02 февраля 2012

Я не совсем понимаю, что вы говорите или пытаетесь решить, но, похоже, вы ищете карту памяти. Смотри man mmap.

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

Обновление, чтобы объяснить немного дальше

На вашем Mac, в терминале, запустите

$ vmmap -resident $$

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

==== Non-writable regions for process 7139
__TEXT 0100000000-00100099000 [  612K   460K] r-x/rwx SM=COW  /bin/bash

Это говорит о том, что в этой области памяти должен быть найден файл /bin/bash (карта памяти снова см. man mmap), и что он не полностью выгружен; только 460kb двоичного файла фактически присутствует в памяти. Что интересно, потому что это исполняемый файл. Другие строки также интересны, но выходят за рамки этого вопроса.

поэтому если в выбранной ОС (iOS) есть разумное управление памятью, ваша проблема на самом деле не существует. Просто не трогайте память, которая вам не нужна; каждый раз, когда вы прикасаетесь к нему, страницы читаются в памяти.

0 голосов
/ 02 февраля 2012

С UIImage вы можете достичь этого - я никогда не пробовал.Вам нужно будет создать UIImage с CGImage, который предоставляет пользовательский CGDataProvider, который использует чтение файла или mmap для доступа к данным.Не уверен, что это сработает - UIImage может сделать копию по пути по той или иной причине, и вы не можете контролировать детали реализации.

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

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

0 голосов
/ 02 февраля 2012

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

0 голосов
/ 02 февраля 2012

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

...