Как сохранить хэш-таблицу в файле?

Ресурсы в Scala работают точно так же, как в Java. Лучше всего следовать лучшим примерам Java и поместить все ресурсы в src/main/resources и src/test/resources.

Пример структуры папок:

testing_styles/
├── build.sbt
├── src
│   └── main
│       ├── resources
│       │   └── readme.txt

Scala 2.12.x

Для чтения ресурсов объект Source предоставляет метод fromResource.

import scala.io.Source
val readmeText : Iterator[String] = Source.fromResource("readme.txt").getLines

previous Версии

Для чтения ресурсов вы можете использовать getClass.getResource и getClass.getResourceAsStream.

val stream : InputStream = getClass.getResourceAsStream("/readme.txt")
val lines = scala.io.Source.fromInputStream( stream ).getLines

Имейте в виду, что getResourceAsStream также отлично работает, когда ресурсы являются частью jar, getResource, который возвращает URL-адрес, который часто используется для создания файла, может привести к проблемам там.

Более чистая обратная связь с ошибкой (2.12.x)

Чтобы избежать несанкционированных Java NPE (Java настолько ужасен), рассмотрите:

import scala.io.Source
import scala.util.Try

def niceFeedbackReadResource(resource: String): List[String] =
  Try(Source.fromResource(resource).getLines.toList)
    .recover(throw new FileNotFoundException(resource))

Чтобы получить значимые FNFE вместо этого.

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

17
задан jfs 7 February 2009 в 23:22
поделиться

6 ответов

Какой язык Вы используете? Общепринятая методика должна сделать некоторую двоичную сериализацию вида.

хорошо, я вижу, что Вы редактируете для добавления языка. Для C++ там несколько опций. Я полагаю, что механизм сериализации Повышения довольно хорош. Кроме того, страница для библиотеки сериализации Повышения также описывает альтернативы. Вот ссылка:

http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/index.html

6
ответ дан 30 November 2019 в 13:21
поделиться

Принятие C/C++: Используйте индексы массива и структуры фиксированного размера вместо выделений переменной длины и указателей. Необходимо смочь непосредственно записать () структуры данных в файл для более позднего чтения () луг.

Для чего-либо высокоуровневого: Много более высоких API языка имеет средства сериализации. Java и QT/C++ оба имеют методы, которые бегут сразу для возражения, таким образом, я знаю, что другие делают также.

5
ответ дан 30 November 2019 в 13:21
поделиться

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

5
ответ дан 30 November 2019 в 13:21
поделиться

Угробьте указатели для индексов.

Это немного подобно построению дискового DAWG, который я действительно некоторое время поддерживал. Что сделало, это столь очень сладкое было то, что это могло быть загружено непосредственно с mmap, вместо этого читая файл. Если пространство хеша управляемо, скажите 2 <глоток> 16 или 2 <глоток> 24 записи, то я думаю, что сделал бы что-то вроде этого:

  • Сохраняют список бесплатных индексов. (если бы таблица пуста, каждый цепной указатель указал бы на следующий индекс.)
  • , Когда объединение в цепочку необходимо, используют свободное пространство в таблице.
  • , Если необходимо поместить что-то в индекс, что это занято поселенцем (переполнение откуда-либо):
    • записывают индекс (давайте назовем его N)
    • подкачивают новый элемент и чем поселенец
    • помещенный, тем поселенец в новом бесплатном индексе, (F).
    • следуют за цепочкой на индексе хеша поселенца, для замены N F.
  • , Если у Вас полностью заканчиваются бесплатные индексы, Вам, вероятно, нужна большая таблица, но можно справиться немного дольше при помощи mremap для создания дополнительной комнаты после таблицы.

Это должно позволить Вам mmap и использовать таблицу непосредственно без модификации. (страшный быстрый, если в кэше ОС!), но необходимо работать с индексами вместо указателей. Это является довольно жутким для имения мегабайтов в наличии в syscall-round-trip-time, и все еще иметь его поднимают меньше, чем это в физической памяти, из-за подкачки страниц.

5
ответ дан 30 November 2019 в 13:21
поделиться

Возможно DBM мог быть полезен для Вас.

2
ответ дан 30 November 2019 в 13:21
поделиться

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

1
ответ дан 30 November 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: