Я думаю, что ответ зависит от того, что вы имеете в виду, говоря «прохождение» и чего вы пытаетесь достичь. Вы говорите, что только добавляете в список: как часто вы добавляете? Как быстро будет расти список? Каковы допустимые накладные расходы на использование памяти по сравнению со временем на перераспределение памяти?
В вашем худшем случае 50 000 000 32-разрядных чисел = 200 мегабайт с использованием наиболее эффективного механизма хранения данных. Предполагая, что вы можете в конечном итоге использовать это в худшем случае, нормально ли использовать такое количество памяти все время? Это лучше, чем часто перераспределять память? Как распределяются типичные модели использования? Вы всегда можете просто использовать int[]
, который предварительно выделен на все 50 миллионов.
Что касается скорости доступа к вашим операциям, нет ничего быстрее, чем итерация и добавление к заранее выделенному фрагменту памяти.
Из OP edit: В памяти может быть приличное количество этих наборов одновременно (~ 100).
Привет. Вам нужно хранить 100 наборов от 1 до 50 миллионов номеров одновременно? Я думаю, что метод bitset - единственный возможный способ, которым это могло бы работать.
Это было бы 600 мегабайт. Немаловажно, но если они (как правило) в основном пустые, кажется очень маловероятным, что вы найдете более эффективный механизм хранения.
Теперь, если вы не используете наборы битов, а используете конструкции с динамическим размером, и они могут как-то занимать меньше места для начала, вы говорите о сценарии реального уродливого выделения / освобождения памяти / сборки мусора. 1018 *
Предположим, вам действительно нужно это сделать, хотя я могу только представить, почему. Итак, у вашего сервера есть тонна памяти, просто выделите столько этих 6-мегабайтных битовых наборов, сколько вам нужно, и переработайте их. Распределение и сборка мусора больше не являются проблемой. Да, вы используете тонну памяти, но это кажется неизбежным.