2015-10-21 2 views
1

У меня есть ситуация, когда у меня много компьютеров и вам нужно иметь уникальные идентификаторы.Самый маленький (по размеру) объект для хранения уникального номера?

Они отправят свои уникальные идентификаторы с запросом API. Объект выглядит

class ID { 
long timestamp; 
int id; 
} 

Самый маленький размер возможный для этого объекта 24 bytes (8 byte long, 4 byte int, 8 byte object reference and 4 byte padding). Мне нужно сохранить миллионы этих объектов в памяти, поэтому память вызывает беспокойство. Мне нужно timestamp для заказа.

Первоначально я думал, что каждый узел, когда он начинает будет UUID (как уникальный String. Поскольку UUID принимает 128 bits он может не поместиться в Int диапазоне

Каковы мои варианты?

+0

Вы считали, что каждый клиент генерирует для каждого запроса 16-байтовый GUID через 'UUID.randomUUID()'? И, может быть, удерживая эти 16 байтов как 2 длинных в существующем объекте? –

+0

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

ответ

0

Даже если ваш объект занимает 24 байта. Даже если у вас есть 10 миллионов, это всего 240 МБ Большое количество, но это мало по сравнению с размером большинства современных ПК.

Итак, я предполагаю, что у вас есть ситуация, которая ограничивает вашу оперативную память.

Итак, предположим, что у вас есть миллионы этих объектов. Предположительно, они будут храниться на жестком диске. В противном случае, когда вы сработаете, вы потеряете миллионы ссылок. Если вам не нужно перебирать список, вы можете сохранить их на жестком диске, чтобы освободить оперативную память.

Если это невозможно, позвольте мне предложить заменить связанный список объектов массивом TimeStamps. Просто отметки времени. Затем вы индексируете в массив с идентификационным номером. Конечно, это предполагает, что идентификационные номера начинаются с 0 и идут в миллионы. Если они распределены случайным образом в области 32-битных целых чисел, это не сработает.

Теперь вам нужно всего 8 байт на запись. Если вам нужно найти идентификатор с определенной отметкой времени, вам необходимо выполнить поиск по всему массиву, ищущему эту метку времени. Если вам нужен поиск по метке времени определенного идентификатора, вы просто индексируете массив.return timstamps[index];

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

+0

С параллельными массивами примитивов, как бы вы поддерживали удаление идентификатора для завершенного запроса? Вы считаете, что все запросы выполняются быстро, чтобы разрешить использование круговой очереди? –

+0

Я думаю, что в моем тексте была ошибка разреза/вставки. Я постараюсь это исправить. Я не предлагал параллельные массивы. Я хотел сказать, что у вас есть один массив временных меток. Затем вы индексируете этот массив с 4-байтным идентификационным номером. Если идентификационные номера являются последовательными (начиная с нуля), то между идентификационными номерами и индексом в массив существует один-на-один. Если вам нужно удалить идентификатор, вы можете сохранить «0» в переменной времени, чтобы указать мертвый элемент. – Teto

+0

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

0

Как вы сказали, вам нужно только миллионы этих объектов. Так, в int, вы до сих пор тысячи этих Milions.

Итак, я бы пошел только с int, состоящим из MACHINE ID + NUMBER.

Если у вас есть 1000 машин, то есть около 2 миллионов цифр, но я полагаю, у вас есть меньшее количество, так, например, даже на 100 машин, у вас еще есть 20 миллионов возможных ...

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

0 - 20 000 000: Machine 1 scope 
21 000 000 - 40 000 000: Machine 2 scope 
.... 
1 000 000 000 - 1 020 000 000: Machine ~100 scope 

Кроме того, не включают в себя такие вещи, как обивка или ссылки - даже если ваш API является объектно-ориентированным, вы все еще можете сделал «оптимизированный для хранения», который будет содержать все/Grop ваших ценностей только в массив (возможно, даже подрезанный по метке времени, так что у вас может быть массив из 10000 целых чисел, с 1000 соответствующими отметками времени и т. д.

+0

'int' для идентификатора машины, временная метка будет длинной, уникальность, если она основана на' id: timestamp' – daydreamer

+0

Вам действительно нужна метка времени? –

+0

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

Смежные вопросы