python: Запихнуть тысячи файлов в один?!

Приветствую!
Появилась задача сделать некий контейнер для файлов. Из требований:
Тысячи мелких файлов (5-100 кб) должны попадать и извлекаться в один большой файл, а так же чтоб была возможность изменить (удалить) определенный файл.
Что не подошло:
zipfile и tarfile — не умеют удалять (изменять) файлы.
Базы данных sqlite3, dbm и пр:
Все нормально, но на одной из платформ, где планируется использовать приложение нет возможности собрать все то, остается только pure python скрипты.
Есть варианты?
  • Вопрос задан
  • 3774 просмотра
Пригласить эксперта
Ответы на вопрос 9
bagyr
@bagyr
Сделать что-то вроде файловой системы CP\M: каждый файл разбиваем на чанки фиксированного размера и их пишем в архив, сохраняя где-то какой чанк какому файлу принадлежит. Поверх этого реализовать итерацию по файлам, сохранение, удаление, чтение, запись.
Костыль эпичный, но как сделать проще, чтобы архив не рос при операциях на файлах без перезаписи, не представляю.
Ответ написан
Комментировать
@rPman
Требуется эффективное размещение файлов внутри контейнера? Терпимо ли двух-трех кратное превышение размера в соотношении с суммарным объемом файлов, но при необходимости можно запустить процедуру перестройки всего архива.
habrahabr.ru/qa/10694/#answer_46206

Код очень простой, за вечер набрать сможет любой (вопрос в разнообразии обслуживающих утилит)
Ответ написан
Комментировать
sergeypid
@sergeypid
Вот такую БД нашел на чистом питоне: buzhug.sourceforge.net/
Ответ написан
@niko83
Как делает фэйсбук для хранения кучи фотографий «Изображения стали хранить в больших бинарных файлах (blob), предоставляя приложению информацию о том, в каком файле и с каким отступом (по сути, идентификатором) от начала расположена каждая фотография. Такой сервис в Facebook получил название Haystack и оказался в десять раз эффективнее „простого“ подхода и в три раза эффективнее „оптимизированного“. Как говорится, все гениальное просто!»
Взято от сюда: www.xakep.ru/post/55510/
Ответ написан
eaa
@eaa
Исходя из вышеприведенных ответов и опыта, что сам задавался подобным вопросом, оказалось, что при многократном чтении и редком изменении (не дополнении, а именно изменении существующего) можно использовать tar — он читает шустро и в конец дописать умеет, а вот если надо что менять — то надо заново файл создавать, ибо внутри менять оно никак не могет. Ну при частом изменении это не вариант.

Посмотрите еще на dar — там в рассылке пробегала инфа и были предложения сделать возможность менять архив, но автор сильно упирался и отказывался от такого функционала. Не знаю, может что продвинулось с тех пор.
Ответ написан
kAIST
@kAIST Автор вопроса
Всем спасибо. В итоге сейчас сделал свой костыль:
Так как постоянному изменению подлежит лишь малая часть данных (список файлов, флаги, атрибуты файлов), а операция удаления файла очень редкая), сделал так:
Тупо пишем в файл содержимое другого файла, в конце файла блок метаданных ( json с тем чем нужно (плюс список файлов с адресами начала файла и длинны) и в конце добиваем размером этого блока. )
Когда нужно дописать новый файл, делаем seek к началу блока с метаданными и пишем туда, опять добавляя в конец измененный блок с метаданными. Если нужно изменить метаданные, просто меняем их в конце файла, не трогая весь файл.
Удаление — редко используемая функция, и как правило удалять файлы нужно большим количество. Это уж можно сделать, путем перебора всего файла, записывая в новый нужное и пропуская ненужное
Ответ написан
@impass
где планируется использовать приложение нет возможности собрать все то

Нечто embedded что ли? Так компилятор же есть, наверняка какую-нибудь из key-value БД собрать всё-таки можно.
Ответ написан
@Ghostwriter
Elliptics от Яндекса делает такую штуку. А также умеет shared-nothing DHT. Есть биндинги для Python.
Ответ написан
Комментировать
smashrod
@smashrod
можно сделать ещё в начале большого файла хеш таблицу смещений, тогда можно будет по файлу находить шустро без внешнего знания чего либо.

Хороший пример файловой бд есть у Стивенса в книге по Си, там идея расписана как организовать key-val бд, тут как раз было бы тоже самое.
Ответ написан
Ваш ответ на вопрос

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

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