Функция сжатия в Java для кеш-системы - PullRequest
0 голосов
/ 06 октября 2011

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

Я ищу хорошую стратегию, а не полную реализацию.Типичный экземпляр объекта, который должен быть кэширован, может быть преобразован в список хэш-карт.Ключи на этой карте очень похожи на ключи на другой карте в этом списке.Ключи и значения являются строками.

Карты в разных объектах кэширования (это также означает, что разные списки) не всегда могут иметь одинаковые ключи.Возможно, только подмножество (50%) ключей одинаково.

Я думал о том, чтобы извлечь ключи в массив заголовков ONE и каждую коллекцию значений хэш-карты в другой массив содинаковой длиныЭто означает, что массив данных может быть разреженным (нулевые указатели).Но мне не нужно носить метаданные.Возможность в массиве данных - единственный способ найти правильный ключ.

Теперь я хочу сжать массив данных.Сжатие не очень хорошо работает на одном массиве данных, потому что информации мало.Чтобы получить хорошую степень сжатия, потребуется несколько объединенных массивов данных.

Есть ли какой-нибудь хороший способ сжатия массивов строк в Java?Сколько из этих массивов данных я должен кластеризовать для получения хороших результатов?

Возможно, есть какой-нибудь лучший aporoach?Это открытые вопросы для сбора идей, поэтому, пожалуйста, не стесняйтесь разрабатывать: -)

Ответы [ 2 ]

0 голосов
/ 06 октября 2011

Это звучит как хороший подход.

Однако я предлагаю вам рассмотреть другой способ разбивки значений карты на списки: вместо того, чтобы составлять список для каждой карты, составьте список для каждого отдельного ключа,содержащие значения для этого ключа для каждого элемента.

Например, если ваши карты:

1: {
    colour: red,
    size: small,
},
2: {
    colour: blue,
    flavour: strawberry
},
3: {
    colour: red,
    size: large,
    flavour: strawberry
}

Затем вы раскладываетесь на:

colour: [red, blue, red]
size: [small, null, large]
flavour: [null, strawberry, strawberry]

Это может показатьсянемного странно, но дело в том, что вы кластеризуете значения одного типа вместе, что поможет сжатию быть более эффективным.

0 голосов
/ 06 октября 2011

Мухи могут помочь

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

Помните, что строка - это объект, поэтому ключ в вашей хэш-карте является ссылкой на нее. Если множество объектов с одинаковым свойством используют ссылки на один и тот же строковый объект, у вас есть только 4 байта для каждой ссылки и только одна строка в памяти.

Как убедиться, что вы разделяете строковые объекты между объектами? Вы можете использовать что-то похожее на String.intern(). Но, пожалуйста, не используйте сам String.intern () .

Стажировка строки возвращает тот же строковый объект для того же строкового значения. Вы должны хранить кеш для этих строк. Причина, по которой я не рекомендую String.intern (), заключается в том, что кеш - это сам класс String, поэтому он никогда не будет освобожден. Но вы можете реализовать что-то аналогичное.

Этот код возвращает вашу собственную строку, если она новая. И возвращает первый, если это не так.

HashMap<String,String> internedStrings = new HashMap<String,String>();

syncrhonized String returnUniqueString(String str) {
   String alreadyCached = internedStrings.get(str);
   if (alreadyCached == null) {
      internedStrings.put(str, str);
      alreadyCached = str;
   }
   return alreadyCached;
}

Но если вы сжимаете, не

Поскольку сжатие означает, что вы сериализуете свои графы объектов, и каждое имя свойства будет сериализовано как отдельная строка, поэтому повторяется. Возможно, сжатый размер не слишком сильно увеличивается, потому что это повторяющаяся строка, но при повторном увлажнении объектов они будут создаваться отдельно.

Может быть, вы можете использовать returnUniqueString во время повторного увлажнения:)

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