Вот идея, о которой я думал, но не тестировал. Я ожидаю, что это будет хорошо в определенных ситуациях:
- Пропускная способность вставки должна быть высокой
- Получение отдельных документов по ключу не требуется
- Все данные выбираются с помощью представлений (возможно, машина отличается от той, которая получает вставки)
План
Вставка пакетов документов и использование представлений для правильной их сериализации.
Пример
Рассмотрим файл журнала с простой отметкой времени и строкой сообщения.
0.001 Start
0.123 This could be any message
0.500 Half a second later!
1.000 One second has gone by
2.000 Two seconds has gone by
[...]
1000.000 One thousand seconds has gone by
Вы можете вставить журналы по одному сообщению на документ, например ::1010 *
{ "_id": "f30d09ef6a9e405994f13a38a44ee4a1",
"_rev": "1-764efa883dda1e11db47671c4a3bbd9e",
"timestamp": 0.123,
"message": "This could be any message"
}
Стандартная оптимизация больших документов
Первая оптимизация - вставка с использованием _bulk_docs
, как в документации по CouchDB для массовых документов .
Оптимизация вторичной массовой вставки
Однако оптимизация секунды заключается в предварительной группировке журналов в один большой документ Couch . Например, в партиях по 4 (в реальном мире это будет намного выше):
{ "_id": "f30d09ef6a9e405994f13a38a44ee4a1",
"_rev": "1-764efa883dda1e11db47671c4a3bbd9e",
"logs": [
{"timestamp": 0.001, "message": "Start"},
{"timestamp": 0.123, "message": "This could be any message"},
{"timestamp": 0.500, "message": "Half a second later!"},
{"timestamp": 1.000, "message": "One second has gone by"}
]
}
{ "_id": "74f615379d98d3c3d4b3f3d4ddce82f8",
"_rev": "1-ea4f43014d555add711ea006efe782da",
"logs": [
{"timestamp": 2.000, "message": "Two seconds has gone by"},
{"timestamp": 3.000, "message": "Three seconds has gone by"},
{"timestamp": 4.000, "message": "Four seconds has gone by"},
{"timestamp": 5.000, "message": "Five seconds has gone by"},
]
}
Конечно, вы также вставите их через _bulk_docs
, эффективно вставляя пакеты данных .
Виды по-прежнему очень просты
По-прежнему очень легко сериализовать журналы обратно в представление:
// map
function(doc) {
if(doc.logs) {
// Just unroll the log batches!
for (var i in doc.logs) {
var log = doc.logs[i];
emit(log.timestamp, log.message);
}
}
}
Тогда будет довольно легко получать журналы с отметками времени между startkey
, endkey
или любыми другими вашими потребностями.
Заключение
Это все еще не тестируется, но я надеюсь, что для некоторых типов данных пакетирование в комки уменьшит количество внутренних записей B-дерева. Надеюсь, что в сочетании с _bulk_docs
пропускная способность вставки снизится до аппаратной скорости диска.