Эффективное преобразование между MongoCursor и OrderedDict в Julia

#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, …). К сожалению, скорость не улучшилась.