Очень эффективная параллельная сортировка большого массива в NumPy или Numba - PullRequest
0 голосов
/ 18 июня 2020

У меня есть множество событий с течением времени. Есть более миллиарда строк, и каждая строка состоит из:

  • user_id
  • timestamp
  • event_type
  • других высокоточных ( float64) числовые столбцы

Мне нужно отсортировать этот массив несколькими способами, но давайте возьмем, например, временную метку. Я пробовал несколько методов, в том числе:

  • сортировка всего массива напрямую с arr = arr[arr.argsort()] => ужасная производительность
  • , используя тот же метод, что и выше, отсортируйте куски массива в параллельно, а затем выполнить окончательную сортировку => лучшая производительность

Тем не менее, даже при использовании метода «сортировка кусками, затем слияние» производительность быстро падает с увеличением количества элементов. Для сортировки 200M строк на машине со 128 ЦП требуется более 5 минут. Это проблема, потому что мне нужно выполнять несколько сортировок подряд, и мне нужно делать это «на лету», т.е. сохранение отсортированного массива на диске раз и навсегда не вариант, потому что элементы всегда добавляются и удаляются, не обязательно в хронологическом порядке.

Есть ли способ значительно улучшить производительность этой сортировки? Например, может ли реализация Numba сортировки слияний, которая работает параллельно, быть решением? Кроме того, меня бы заинтересовал метод, который работает для сортировки по нескольким столбцам (например, сортировка по [user_id, timestamp]).

Примечания:

  • массив имеет dtype np.float64 и должен оставаться таким из-за содержимого других столбцов, которые не упомянуты в приведенном выше примере.

  • мы думали об использовании базы данных с отдельными таблицами, одна для каждая конкретная сортировка - преимущество будет в том, что таблицы всегда отлично отсортированы, но недостаток заключается в скорости извлечения

  • по вышеуказанной причине мы использовали локальные файлы Parquet, которые невероятно быстро получить, но тогда это означает, что нам нужно отсортировать их после загрузки

...