Я отправляю это по отношению к другому открытому вопросу, который у меня есть, однако я думал, что это заслуживает собственного вопроса.Java-сопоставление многомерных массивов с одиночными
Альтернативный вопрос (для справки): Java Proxy Discovering Bot
В принципе, мне нужно хранить очень большие объемы данных и иметь доступ к нему очень быстро. Это будет работать идеально в неограниченной ситуации памяти:
boolean[][][][] sets = new boolean[256][256][256][256];
boolean get(byte[] a) {
return sets[a[0]][a[1]][a[2]][a[3]];
}
Однако, это использует около 16 Гб оперативной памяти, которая слишком много для моего приложения. Я полагаю, что если использовать биты вместо booleans (хранится как 4 байта на Java), это сократит использование памяти примерно на 512 МБ. Тем не менее, я не могу представить себе, как правильно обращаться к битам. Например, если вы сопоставили каждый адрес примерно так: position = a * b * c * d, то он сопоставил бы тот же бит, что и d * c * b * a и т. Д.
Я нашел эту тему, охватывающую как конвертировать 2D массивов в 1D-массивы, но я не могу склонить голову вокруг того, как расширить это до 4D-массива. Может кто-нибудь объяснить это? Map a 2D array onto a 1D array C
Раствор для 2D -> 1D массивы:
int array[width * height];
int SetElement(int row, int col, int value)
{
array[width * row + col] = value;
}
Я просто не уверен в том, как распространить его на 4D -> 1D
int array[256 * 256 * 256 * 256];
int setElement(int a, int b, int c, int d, boolean value)
{
array[?????????] = value;
}
Вы можете использовать класс BitSet в Java. Кроме того, вам не нужно удалять любые, кроме последнего измерения. Таким образом, трехмерный массив битовых наборов, где четвертое измерение булевых потоков рушится в BitSet, должно хорошо работать, я думаю? – flup
@flup Я только что проверил это, трехмерный массив BitSet. Однако для их инициализации требуется более 5 минут. (Продолжается, еще не завершено). Я предпочел бы использовать только один бит, кажется, что это возможно при правильном доступе к битам. – Colby