У меня есть очень большой набор данных в mongoDB, который запрашивается и добавляется в результирующий DataFrame.
for tree in db.im_tree_active.find({"date" : { '$gte' : startdate ,
'$lte' : enddate },"depth" : {'$gte' : 1, '$lte' : 4}, no_cursor_timeout = True).batch_size(1500):
if count % 1000 == 0:
print(count, tot)
#keyFill(keylist, tree) <-- added to compensate for mismatched columns
#im = im.append(tree) <-- ran too slowly
im.loc[count, :] = tree <-- runs much faster but keyFill() slows down
count+=1
С помощью функции pandas .append()
была создана копия фрейма данных, что заняло слишком много времени, когда фрейм данных стал намного больше.
Я заменил оператор добавления на оператор .loc[]
, который я прочитал, должен немного ускорить запрос, однако я получаю несоответствующую ошибку столбца. Это потому, что некоторые из trees
, которые повторяются в MongoDB, не имеют некоторых полей, которые есть у других. Я исправил это, добавив функцию keyFill()
, заданную следующим простым кодом:
def keyFill(keylist, tree):
for key in keylist:
if key not in tree.keys():
tree[key] = ""
return tree
Однако выполнение этого перед каждым вызовом .loc[]
приводит к замедлению запроса почти на 1000% (по оценкам).
Есть ли способ ускорить весь этот процесс? Запрос выполняется намного быстрее, прежде чем он достигает около 50% по набору данных, а затем продолжает замедляться до такой степени, что последние 1000 деревьев, которые он добавляет, выполняются почти в 10 раз дольше, чем первая 1000.