Сохранение больших объектов в файл - PullRequest
0 голосов
/ 08 августа 2009

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

Итак, я начал изучать сохранение большого количества данных. Я пытался использовать NSKeyedUnarchiver и [NSDictionary writeToFile:atomically:], но оба не удалось с ошибками malloc (не удается выделить ____ байт).

Я просмотрел SO, форумы разработчиков Apple и Google, но ничего не смог найти. Мне интересно, может быть, было бы лучше создать файл побитно, а не все сразу, но я все равно не могу добавить его к существующему файлу. Я не совсем против сохранения с кучей маленьких файлов, но я бы предпочел использовать один большой файл.

Спасибо!

Отредактировано для включения дополнительной информации: я не уверен, сколько служебных данных дает NSDictionary, поскольку я не беру всю информацию из текстовых файлов. У меня есть файл 1,5 гигабайта (из которых я держу ~ 1/2), и он оказывается около 900 мегабайт через 1 гигабайт в оперативной памяти. В конечном итоге мне нужно будет добавить еще несколько данных, но они будут построены со ссылками на то, что уже загружено в память - их размер не должен удваиваться, но может приблизиться.

Все данные являются последовательными и могут быть разделены в хранилище, но для выполнения все они должны находиться в памяти. В настоящее время у меня есть пары integer / string, и в итоге я получу пары string / strings (при этом все значения также являются ключом для другого набора строк, поэтому окончательные требования к хранилищу будут такими же, как у меня в настоящее время, плюс куча ссылок).

В конце мне нужно будет связать ~ 3 миллиона строк с некоторым другим набором строк. Однако единственная важная вещь - это связь между этими строками - я мог бы хэшировать их все, но NSNumber (поскольку NSDictionary нужны объекты) может дать мне столько же накладных расходов.

Ответы [ 2 ]

0 голосов
/ 09 августа 2009

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

Рассматривали ли вы использование встроенной базы данных sqllite? Затем вы можете обрабатывать данные, но, возможно, одновременно загружать только фрагмент структуры данных.

0 голосов
/ 08 августа 2009

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

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

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