2012-05-14 2 views
1

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

ответ

1

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

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

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

+0

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

+0

Мне не нужен случайный доступ к данным, но мне кажется, что накладные расходы и медленная работа для меня открывать и открывать временный файл каждый раз, когда данные нужны для вывода. Обратите внимание, что мне не нужно получать доступ к данным во время их создания. Поэтому я мог писать в трубу, закрывать ее, открывать ее снова и читать, но я не уверен, что происходит с данными в трубе в этом случае. Я думаю, что это настойчиво, пока не будет прочитано. Но хранится ли он в временном файле? – highsciguy

+0

Ну, если обычный случай заключается в том, что данные коротки, но иногда они длинны, то вы можете закрепить его в памяти до тех пор, пока он не превысит порог определенного размера, а затем переместите его во временный файл. Это больше подходит для вас, потому что вы должны обрабатывать оба случая в своем коде. В зависимости от ваших потребностей может быть проще принять накладные расходы и всегда использовать временный файл. – Celada

0

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

Труба не будет хорошей идеей, так как это метод взаимодействия между процессами с очень небольшим размером памяти (около 64kiB с Linux 2.6, в 2.4, это было AFAIR еще меньше - 4 kiB или около того).

+0

Конечно! Но мне кажется, что должен быть стандартный способ сделать это. – highsciguy

Смежные вопросы