Сохраните ключ / значения карты в постоянном файле - PullRequest
11 голосов
/ 13 октября 2011

Я буду создавать структуру более или менее в форме:

type FileState struct {
    LastModified int64
    Hash string
    Path string
}

Я хочу записать эти значения в файл и прочитать их при последующих вызовах. Мой первоначальный план состоит в том, чтобы прочитать их в карту и посмотреть значения (Hash и LastModified), используя ключ (Path). Есть ли отличный способ сделать это в Go?

Если нет, какой формат файла вы можете порекомендовать? Я читал и экспериментировал с некоторыми хранилищами файлов ключей / значений в предыдущих проектах, но не использовал Go. Сейчас мои требования, вероятно, довольно просты, поэтому большая система серверов баз данных будет излишней. Я просто хочу что-то, что я могу писать и читать быстро, легко и переносимо (Windows, Mac, Linux). Поскольку мне приходится развертывать на нескольких платформах, я стараюсь свести к минимуму свои не-ходовые зависимости.

Я рассмотрел XML, CSV, JSON. Я кратко посмотрел на пакет gob в Go и заметил пакет BSON на панели инструментов пакета Go, но я не уверен, применимы ли они.

Моя основная задача - быстро начать работу, что означает наименьшее количество кода, которое мне нужно написать, и простоту развертывания.

Ответы [ 3 ]

9 голосов
/ 13 октября 2011

Пока ваши данные помещаются в память, у вас не должно быть проблем.Хорошей идеей является использование карты в памяти и регулярная запись снимков на диск (например, с помощью пакета gob).

Практическое программирование на Go , написанное Эндрю Геррандом, использует эту технику. *1004*

Если вам нужен доступ к этим файлам с помощью различных программ, вероятно, хорошей идеей будет использование популярной кодировки, такой как json или csv.Если вам просто нужно получить доступ к этому файлу из Go, я бы использовал отличный пакет gob, который имеет множество приятных функций .

Как только ваши данные станут больше, это не такхорошая идея всегда записывать всю базу данных на диск при каждом изменении.Кроме того, ваши данные могут больше не помещаться в оперативную память.В этом случае вам может понадобиться взглянуть на пакет базы данных leveldb key-value от Найджела Тао, другого разработчика Go.В настоящее время он находится в активной разработке (но еще не используется), но он также предлагает некоторые расширенные функции, такие как транзакции и автоматическое сжатие.Кроме того, пропускная способность чтения / записи должна быть достаточно хорошей из-за дизайна leveldb.

1 голос
/ 03 мая 2013

Для этого я написал упорядоченную библиотеку персистентности ключ-значение, которая называется gkvlite -
https://github.com/steveyen/gkvlite

1 голос
/ 13 октября 2011

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

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

Кстати, используйтеПакет CSV идти, чтобы сделать это.

...