временные файлы против malloc (в C) - PullRequest
1 голос
/ 07 октября 2010

У меня есть программа, которая генерирует переменное количество данных, которые необходимо сохранить для дальнейшего использования. Когда я должен использовать mallod + realloc и когда мне следует использовать временные файлы?

Ответы [ 7 ]

6 голосов
/ 07 октября 2010

mmap(2,3p) (или сопоставления файлов ) означает, что вам никогда не придется выбирать между ними.

1 голос
/ 07 октября 2010

Используйте временные файлы, если размер ваших данных превышает размер виртуального адресного пространства вашей целевой системы (2-3 ГБ на 32-разрядных хостах) или если он по крайней мере достаточно велик, что может привести к серьезной нагрузке на ресурсы система.

В противном случае используйте malloc.

Если вы идете по пути временных файлов, используйте функцию tmpfile для их создания, поскольку в хороших системах у них никогда не будет имен в файловой системе, и у них не будет шанса остаться в стороне, если ваша программа аварийно завершится. Большинству людей не нравится бесполезность временных файлов, так как продукты Microsoft Office имеют тенденцию выходить повсюду. ; -)

1 голос
/ 07 октября 2010

Предпочитайте временный файл, если вам нужно / хотите, чтобы он был виден другим процессам, и malloc / realloc, если нет. Также рассмотрите объем данных по сравнению с вашим адресным пространством и виртуальной памятью: будут ли данные занимать слишком много места подкачки, если их оставить в памяти? Также подумайте, насколько хорошо подходит соответствующее применение для вашего приложения: чтение / запись файла и т. Д. Может быть трудной задачей по сравнению с доступом к памяти ... файлы с отображением в памяти делают это проще, но вам может потребоваться поддержка пользовательских библиотек для динамического распределения памяти внутри них.

0 голосов
/ 07 октября 2010

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

0 голосов
/ 07 октября 2010

В 32-битной системе вы не сможете malloc () более 2 ГБ или 3 ГБ или около того. Большим преимуществом файлов является то, что они ограничены только размером диска. Даже в 64-разрядной системе необычно иметь возможность выделять более 8 ГБ или 16 ГБ, поскольку обычно существуют ограничения на размер файла подкачки.

0 голосов
/ 07 октября 2010

Если вы знаете максимальный размер, он не слишком большой и вам нужна только одна копия, вам следует использовать статический буфер, выделенный во время загрузки программы:

char buffer[1000];
int  buffSizeUsed;

Если какое-либо из этих предварительных условийложны, и вам нужна только информация во время работы программы, используйте malloc:

char *buffer = malloc (actualSize);

Просто убедитесь, что вы проверяете, что распределение работает, и что вы освобождаете все, что выделяете.

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

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

Это в основном происходит от самого простого /наименее гибкий к самым сложным / наиболее гибким возможностям.

Если ваши требования лежат в этом направлении, это решение, которое вам нужно принять.

0 голосов
/ 07 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...