Задать вопрос

Как хранить в файле огромный массив объектов?

Допустим, что в массиве имеется множество (от 10 000 до 100 000) объектов различных классов с несколькими типами свойств и переменных. Все классы объектов наследуются от базового класса. Все значения переменных и свойств такого множества объектов уникальны. Необходимо хранить и считывать данные объектов из файла.

Совсем не подходит хранить объекты в формате, скажем, XML или JSON - выходит слишком большой объем файла, который и место кушает, и по сети фиг передаш. В каком виде хранить данные этих объектов с минимальными затратами дискового пространства?
  • Вопрос задан
  • 2838 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
Mrrl
@Mrrl
Заводчик кардиганов
Каждому классу присвоить id (целое число), и написать для этого класса функции записи в бинарный поток и чтения из него. Записывать непосредственно значения полей.
Если потребуется прямой доступ к объектам, то при создании файла отвести в начале место для ссылок на положение каждого элемента массива в файле, потом, по мере создания файла накапливать эти ссылки. В конце записать. Если прямого доступа не нужно - писать и потом читать все объекты подряд.
Если структура классов будет меняться, и иногда потребуется читать старые файлы, надо предусмотреть номер версии, чтобы десериализатор класса мог его учитывать. Читать новый файл старой программой при этом не получится.
Если есть информация о диапазонах значений полей, можно записывать меньше байтов, чем размер типа (например, для целых - два или три байта). Для массивов можно предусмотреть упаковки какими-нибудь разностными схемами.
Ответ написан
Комментировать
lorka
@lorka
Game-develop
Хранить структурированные объекты в файле - не лучшая идея, тем более, таких размеров. Если нет возможности использовать MySQL или другие сервисные БД - возможно, стоит взглянуть в сторону sqlite? Если же нужно именно в файле - тогда стоит обратиться уже к возможностям файловой системы - это SSD диски, RAID1(RAID2, если есть минимум 4 харда) либо RAM-диск(в последнем случае озаботится резервным копированием, а еще лучше - зеркалированием на реальный хард).
Ответ написан
Комментировать
Neuroware
@Neuroware
Программист в свободное от работы время
поддерживаю Mrrl файл после сохранения\сериализации можно легко сжать zip, если там не jpg внутри сожмется раз в 2-20
Ответ написан
Комментировать
@mayorovp
Сериализуйте в XML и сжимайте gzip.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы