2015-03-16 2 views
1

У меня есть двоичный файл ~ 400 МБ, который я хочу преобразовать в формат CSV. Выходной файл CSV будет ~ 1 ГБ (по моим расчетам).Расход RAM при открытии файла

Я прочитал двоичный файл и сохранил его в массиве структур (требуется также для другой обработки), и когда пользователь хочет экспортировать его в CSV, я создаю файл (или открываю существующий файл - в зависимости от выбор пользователя), открывая его с помощью fopen, а затем записывая его, используя fwrite, по строкам. Coming на мой вопрос, это link из CPlusPlus.com говорит:

Возвращенный поток полностью буферном по умолчанию, если известно, не относятся к интерактивному устройству

Мой запрос, когда Я открою этот файл, будет ли он загружен в ОЗУ? Например, когда в конце мой файл имеет ~ 1 ГБ, будет ли он потреблять столько ОЗУ или он будет только на жестком диске?

Этот код будет работать как в Windows, так и в Android.

+0

@BasileStarynkevitch Я планирую запустить его на Windows и Android (обновлен вопрос) – Swanand

+1

Люди, которые разработали кеш-память вашей операционной системы, знают, что они делают. Если они спроектировали его для использования 1 ГБ ОЗУ, это потому, что это то, что, по их мнению, лучше всего использовать для этой ОЗУ. (Не похоже, что вы можете сохранить ОЗУ на потом, правда?) Так что не беспокойтесь об этом. - Если бы не было ничего общего с этим 1 ГБ, и какая-то программа считывала файл обратно, имея в ОЗУ спасет много ввода-вывода. –

ответ

1

Это operating system и file system и компьютер специфический. И это может быть не так важно. Читайте перевод информации о page cache.

BTW, вы можете быть заинтересованы по sqlite

С точки приложения писателя зрения, вы должны больше заботиться о virtual memory и address space из ваших process, чем о памяти. Управление физической операцией осуществляется операционной системой.

В Linux и Android, если вы хотите оптимизировать это, вы можете рассмотреть (позже) с помощью posix_fadvise(2) и, возможно, madvise(2). Я не уверен, что это боль в вашем случае (поскольку файл с гигабайтом не так уж и много сегодня).

2

FILE* потоки буферизации является функцией С, и он используется, чтобы уменьшить накладные расходы системного вызова (т.е. не называют read() для каждого fgetc(), который стоит дорого). Обычно буфер небольшой - то есть 512 байт.

Страница кэш или аналогичные механизмы - это разные звери - они используются для уменьшения количества операций с дисками. Обычно операционная система использует память для кэширования ранее прочитанных или записанных данных на диск, поэтому последующие операции будут использовать ОЗУ.

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

0

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

Чтение само по себе не использует много памяти, как и мой, говорит, что буфер небольшой. Слон в комнате здесь: вы читаете весь файл и помещаете все данные в структуры? или вы начинаете обрабатывать после одного или нескольких чтений, чтобы получить минимальный объем данных необходимо, чтобы сделать некоторую обработку?Выполнение первого действительно будет использовать память ~ 400 Мбайт или более, поэтому более поздняя версия будет использовать намного меньше, что, как говорится, все зависит от количества данных , необходимых, чтобы начать обработку, и, возможно, вам нужны все данные, загруженные на один раз.

+0

Мне нужно хранить для хранения всего файла Структуры данных ... Вот почему я волнуюсь. Я уже использую 400 МБ ОЗУ. Я думал, что экспорт будет потреблять 1 ГБ, делая все нестабильным. – Swanand

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