Звучит как работа для .... new ObjectOutputStream(new FileOutputStream(STORAGE_DIR + "/" + key + ".dat");
!!
Серьезно - самый простой метод - просто создать файл для каждой таблицы данных, в которой вы хотите сохранить данные, сериализовать данные и найти их, используя ключ в качестве имени файла, когда вы хотите прочитать.
В приличной файловой системе записи могут быть сделаны атомарными (путем записи во временный файл и затем переименованием файла); скорость чтения / записи измеряется в 10 с Мбит / с; поиск можно сделать очень эффективным, создав простое дерево каталогов, подобное STORAGE_DIR + "/" + key.substring(0,2) + "/" + key.substring(0,4) + "/" + key
, которое должно быть эффективным с миллионами записей и даже более эффективным, если ваша файловая система использует индексированные каталоги; и, наконец, тривиально реализовать кэш-память LRU на основе памяти для еще более быстрого поиска.
Относительно сжатия - вы можете использовать обыкновенное сжатие Джакарты, чтобы повлиять на сжатие gzip или даже bzip2 на данные перед их сохранением. Но это проблема оптимизации, и в зависимости от вашего приложения и доступного дискового пространства вам может быть выгоднее инвестировать циклы ЦП в другом месте.
Вот пример реализации, который я сделал: http://geek.co.il/articles/geek-storage.zip. Он использует простой интерфейс (который далеко не чистый - это просто демонстрация концепции), который предлагает методы для хранения и извлечения объектов из кэша. с установленным максимальным размером. Промах кэша передается пользовательской реализации для обработки, и кэш будет периодически проверять, не превышает ли он требования к хранилищу, и удаляет старые данные.
Я также включил реализацию с поддержкой MySQL для завершения и бенчмарк для сравнения реализаций на основе дисков и MySQL. На моей домашней машине (старый Athlon 64) тест производительности диска показал результаты, которые в два раза быстрее, чем реализация MySQL в прилагаемом тесте (9,01 секунды против 18,17 секунды). Несмотря на то, что реализация БД, возможно, может быть слегка улучшена, я считаю, что она достаточно хорошо демонстрирует проблему.
Не стесняйтесь использовать это по своему усмотрению.