2013-03-25 4 views
1

У меня есть файл размером 50 ГБ, который является отсортированным файлом CSV.Выполняя mmap, будут ли C или Java иметь существенные отличия в производительности?

Было бы теоретически иметь значение, если бы я выполнял поиск по этому файлу с помощью сопоставления памяти с использованием C или java?

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

ответ

2

В теории теории Java будет бесконечно медленнее из-за необходимости дополнительных косвенностей из-за вызова объектно-ориентированного метода Java и, возможно, из-за необходимости пересекать границу Java/JNI.

В практике компилятор Hotspot оптимизирует прямой доступ ByteBuffer, а стоимость сбоев страниц будет намного превышать дополнительную память.

+1

И в качестве комментария я бы преобразовал CSV в бинарный формат фиксированной длины для использования. – parsifal

+0

Может ли java выполнить файл с отображением памяти размером более 10 ГБ? любые ограничения? – loyalflow

+0

@ user1361315 - Возможно, вам понадобится опция '-XX: MaxDirectMemorySize' (например:' -XX: MaxDirectMemorySize = 64g'. Это используется как внутренний триггер для сбора мусора сопоставленных буферов. Я не уверен, какие версии требуется 1,6, и я ожидал бы 1.7. – parsifal

1

Дает прямой ответ на вопрос.

C mmap() и Java FileChannel.map() считаются почти эквивалентами и не будут иметь существенных различий в производительности.

1

Java может отображать только 2 ГБ за раз. Это связано с тем, что ByteBuffer использует 32-разрядные целые числа для длины, размера и т. Д. Таким образом, вам понадобится 25 мм для вашего файла размером 50 ГБ. C может создать только один mmap, хотя он не будет переносимым для компьютеров 1990-х годов (если вам это интересно)

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

  • Нет связанных вопросов^_^