Загрузка Pandas DataFrame с данными из курсора / итератора PyMongo слишком медленная - PullRequest
0 голосов
/ 24 января 2019

Мне нужно извлечь 230000 документов из базы данных Монго, расположенной в другой стране, и загрузить их в DataFrame.

cursor = mydb.mycollection.find(filter, {"projection 1": 1, "projection 2": 1, "projection 3": 1, ... , "projection 18": 1}, batch_size=25000) находит данные мгновенно, но их передача на фрейм данных с помощью df = DataFrame(list(cursor)) занимает 24 секунды, что слишком долго.

Я пытался превратить итератор в несколько небольших фреймов данных и объединить их, но результат тот же (24 секунды):

    def iterator2dataframes(iterator, chunk_size: int):
      """Turn an iterator into multiple small pandas.DataFrame
      This is a balance between memory and efficiency"""
      records = []
      frames = []
      for i, record in enumerate(iterator):
          records.append(record)
          if i % chunk_size == chunk_size - 1:
              frames.append(pd.DataFrame(records))
              records = []
      if records:
          frames.append(pd.DataFrame(records))
      return pd.concat(frames)
    df = iterator2dataframes(cursor, 25000)

Как я могу ускорить это? Тем более, что в какой-то момент мне придется загружать DataFrame, используя 30-40 миллионов документов Mongo, в кратчайшие сроки.

Есть ли способ использовать массовый дамп для фрейма данных?

...