Сохраните ключ / значения карты в постоянном файле

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

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 ответа

Решение

Пока ваши данные помещаются в память, у вас не должно быть проблем. Использование карты в памяти и регулярная запись снимков на диск (например, с помощью gob пакет) хорошая идея. В разговоре Эндрю Геррана о практическом программировании на Go используется эта техника.

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

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

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

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

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

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

Другие вопросы по тегам