#mongodb #julia #ordereddictionary
#mongodb #julia #ordereddictionary
Вопрос:
Я использую mongo.jl и мне нужен более эффективный способ преобразования между MongoCursor
и OrderedDict
Здесь захват курсора данных с помощью find
обычно занимает < 1 секунды. Извлечение и преобразование в OrderedDict занимает ~ 20 секунд.
using Mongo
...
collection = MongoCollection(client, "myDB", json)
dataPre = find(collection, Dict(category=>id)) #Returns type Mongo.MongoCursor
i = 1
data = DataStructures.OrderedDict()
for rec in dataPre
data[i] = dict(rec)
i=i 1
end
Редактировать: Благодаря использованию я понял @profile
, что 95% моей задержки связано с преобразованием из dict в array, а это несколько строк, которые я опустил в примере кода.
Вот тот же пример кода с пропущенной строкой:
using Mongo
...
collection = MongoCollection(client, "myDB", json)
dataPre = find(collection, Dict(category=>id)) #Returns type Mongo.MongoCursor
i = 1
data = DataStructures.OrderedDict()
form_arr = Array(Float64,(100,100,8,length(dataPre)))
for rec in dataPre
data = dict(rec) #A
for v1 = 1:100
for v2 = 1:8
form_arr[v1,:,v2,i] = data["info"][v1]["meas"][v2]["vals"] #B
end
end
i=i 1
end
Профилировщик указывает, что строка A занимает ~ 5% времени, а строка B — 95% времени.
Я застрял с этой структурой dict.. Есть ли способ более эффективно извлекать и форматировать данные?
Комментарии:
1. Курсор обычно является виртуальным представлением результата. Только при повторном перемещении курсора фактический ответ будет извлечен с сервера в память клиента. Таким образом, время, которое вы видите, может быть не для преобразования в OrderedDict, это может быть просто время, необходимое mongo для получения результатов от клиента. Если вы профилируете свой код, вы сможете доказать, так ли это.
2. Спасибо за указатель. Вы заставили меня запустить профилировщик для проверки и на самом деле обнаружили, что основная проблема заключается в преобразовании из Dict в массив с несколькими размерами.. Я добавил расширенный пример, если у вас есть какие-либо идеи?
3. Что это за
dict
метод?? Вы вызываетеdict(dataPre)
, но я не могу найти метод, подобный этому определенному. Это частный метод? Обратите внимание, что, как правило, вам не нужно преобразовывать в dic, чтобы получить поля из результата Mongo.rec
Переменная, которая является элементом в вашем цикле for, будет иметь типBSONObject
, и вы можете напрямую индексировать в нееrec["info"][v1]["meas"][v2]["vals"]
4. Если я это сделаю, я получу сообщение об ошибке, в котором говорится, что преобразование между объектом BSON и float64 невозможно. То же самое, если я не использую dict и оборачиваю результат в Float64()
5. Я исправил проблему, которую вы подняли, удалив dict () и используя вместо этого Float64 () или map (Float64, …). К сожалению, скорость не улучшилась.