Проблема
Мне нужно прочитать и написать большое количество записей (около 1000).В приведенном ниже примере для записи 1000 записей требуется 20 минут, а для их чтения - 12 секунд (когда я выполняю свои тесты «чтения», я закомментирую строку do create_notes()
).
Источник
Это полный пример (который собирается и запускается).Он выводит только вывод на консоль (не в браузер).
type User.t =
{ id : int
; notes : list(int) // a list of note ids
}
type Note.t =
{ id : int
; uid : int // id of the user this note belongs to
; content : string
}
db /user : intmap(User.t)
db /note : intmap(Note.t)
get_notes(uid:int) : list(Note.t) =
noteids = /user[uid]/notes
List.fold(
(h,acc ->
match ?/note[h] with
| {none} -> acc
| {some = note} -> [note|acc]
), noteids, [])
create_user() =
match ?/user[0] with
| {none} -> /user[0] <- {id=0 notes=[]}
| _ -> void
create_note() =
key = Db.fresh_key(@/note)
do /note[key] <- {id = key uid = 0 content = "note"}
noteids = /user[0]/notes
/user[0]/notes <- [key|noteids]
create_notes() =
repeat(1000, create_note)
page() =
do create_user()
do create_notes()
do Debug.alert("{get_notes(0)}")
<>Notes</>
server = one_page_server("Notes", page)
Еще одна вещь
Я также пытался получать заметки с помощью транзакции (показано ниже).Похоже, Db.transaction может быть правильным инструментом, но я не нашел способа успешно использовать его.Я обнаружил, что этот метод get_notes_via_transaction
работает так же медленно, как get_notes
.
get_notes_via_transaction(uid:int) : list(Note.t) =
result = Db.transaction( ->
noteids = /user[uid]/notes
List.fold(
(h,acc ->
match ?/note[h] with
| {none} -> acc
| {some = note} -> [note|acc]
), noteids, [])
)
match result with
| {none} -> []
|~{some} -> some
Спасибо за вашу помощь.
Редактировать: Подробнее
Aнемного дополнительной информации, которая может оказаться полезной:
После дополнительного тестирования я заметил, что написание первых 100 записей занимает всего 5 секунд.Каждая запись занимает больше времени, чем предыдущая.На 500-й записи для записи каждой записи требуется 5 секунд.
Если я прерываю программу (когда она начинает медленно работать) и запускаю ее снова (без очистки базы данных), оназаписывает записи в том же (медленном) темпе, который записывал, когда я его прерывал.
Это приближает нас к решению?