VGrabko
@VGrabko
Golang, Php, Js

Стоит ли так делать?

Сейчас я хочу попробовать что то новое (уйти от стандартных бд вроде мусколя и постгрес). Я сделал сервис в котором жестко в коде сделал структуры данных (вроде таблиц), а в роли индекса выступает подобная система
//структура юзеров
type User struct{
  login string
  email string
}
//первичный индекс int == id. Он используется в индексах других таблиц
var UserId  map[int]User
//индекс на логин где string индекс, а int хранит ключ для массива UserId
var UserIndexLogin map[string]int

Всё это дело пока что я при записи/обновлении кодирую в json и сохраняю в файл. Потом я этот алгоритм улучшу путём создания вместо огромного json всей таблицы на кучу мелких (один id == один json всех структур). Но боюсь что с этим выйдут проблемы (как отнесётся файловая система к 100к мелких фалов в одной директории...) по этому думаю фс заменить на NoSql бд только вот все что я нашел хранят данные в озу, а мне нужна безопасная (гарантированная) запись на диск.

Так как озу рано или поздно не хватит я сделал масив который хранит UnixTime последнего обращения к каждому из id и те к которым долго не обращались тупо удаляю.

Но я так и не разобрался как можно узнать сколько всё это дело занимает места в озу.
Если много букаф
Нужна NoSql которая гарантированно сохранить данные на жд и с возможностью легкого маштабирвания. Что взять?

Как в golang узнать сколько места в озу занимают все глобальные переменные?
  • Вопрос задан
  • 944 просмотра
Решения вопроса 3
@FireGM
1. если нужна noSql,то mongodb с настроенным fsync'ом.
2. Посчитать вручную, никто же не знает, сколько вы отведёте на логин символов или сколько будет всего таких профилей. Ну или если "вот прям щас", то https://golang.org/pkg/net/http/pprof/
Ответ написан
@mantyr
Пишу много Golang кода с удовольствием:)
len([]byte("string")) // <-- количество байт

Другое дело что базы данных часто:
  • сжимают данные (особенно текстовые), по этому картинки и не рекомендуют складывать в базу данных
  • хранят множество различных индексов на каждую запись, что бы было удобно доставать данные
  • хранят указатели на данные
  • хранят логи (бинарные или текстовые)
  • имеют кеш в памяти
  • имеют лог транзакций (или не имеют, в зависимости от базы)
  • много чего еще

По этому размер "таблицы" или "базы данных" в каждом случае считается по своему.

Из in-memory баз данных с гарантированным сохранением на диск сейчас активно пиарят Tarantool, там как раз все данные в памяти, но при записи они становятся доступными только когда произошла запись в лог на диск. Если есть достаточное количество оперативки то хороший выбор, на нём живёт множество сервисов "большого" русского интернета.

Если оперативки мало (500 мегабайт например), то больше подойдёт классическая база данных с кешированием горячих данных.
Ответ написан
Комментировать
@Gizmothron
Читай на Хабре серию статей про Tarantool.
Это json-подобное хранилище данных в оперативной памяти.
С индексами.
И с гарантией записи на диск.

Автор Тарантула рассказывает об том, как они этого добились.
Там несколько файлов используется. Т.н. Лог или Журнал.

Подобные же вещи используются в серьезных СУБД Oracle, MS-SQL, PostgreSQL
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы