Существует ли эквивалент встроенных структур данных с отображением памяти (как вы могли бы в C ) в Java?

#java #performance #data-structures #virtual-machine #mmap

#java #Производительность #структуры данных #виртуальная машина #mmap

Вопрос:

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

В мире C я бы предварительно запек структуру данных в файл. Есть приемы, которые затем позволили бы мне сопоставить этот файл с определенным виртуальным адресом, что позволило бы мне даже предварительно испечь указатели (хотя, можно заменить указатели смещениями и сопоставить везде, где их поместила ОС.). Затем я бы записал файл в memmap, и загрузка была бы эффективно выполнена. Все было бы мгновенно доступно так же, как и заменяемая страница.

Java не делает это таким простым. В лучшем случае я мог бы mmap файл, затем искать структуры данных узлов Java в виртуальной машине и, не найдя их там, загружать их по требованию с карты. Я не так доволен этим решением, поскольку оно приведет к гораздо большему обмену. Также потребуется больше памяти, если размеры узлов непостоянны.

Короче говоря, если бы мне нужно было упаковать структуру данных размером во много ТБ в файл таким образом, чтобы на нее можно было напрямую ссылаться в Java, как бы я это сделал?

Комментарии:

1. ДА. MappedByteBuffer это именно то, что вы ищете.

2. MappedByteBuffer — это просто быстрый доступ к файлу на диске — в нем отсутствует необходимая мне абстракция из C / , где представление структуры данных само содержится в файле, поэтому мне не нужно переводить его в копию самого себя, чтобы использовать его в Java. Или я что-то недопонимаю в этом? Например, в C я мог бы mmap файл по определенному адресу, и с этого момента вся структура данных завершена, сконструирована, действительна и доступна через виртуальную память.

3. Это не ответ, но, возможно, нативная привязка была бы решением, и выполнение сопоставления на C было бы решением? Java по своей конструкции пытается избегать таких низкоуровневых концепций, как указатели, однако также есть java-native-access.github.io/jna/4.2.1/com/sun/jna/Pointer.html , так что, может быть, этого некоторого использования Serializable было бы достаточно?

4. @Sniggerfardimungus Java не может этого сделать. MappedByteBuffer это самое близкое, что вы можете получить.

5. @AdamKotwasinski Ты читаешь мои мысли. Я рассматривал это, но мы в значительной степени специализируемся на Java и Python. Как бы мне ни нравился C , и я понимаю, что он идеально подошел бы для этого приложения, я хочу избежать необходимости добавлять поддержку третьего языка в наш процесс компиляции / упаковки / тестирования / развертывания. =~ (