У меня есть два кадра данных: a (~600 млн строк) и b (~2 млн строк). Как лучше всего соединить b с a при использовании 1 условия равенства и 2 условий неравенства в соответствующих столбцах?
a_1 = b_1
a_2 >= b_2
a_3 >= b_3
На данный момент я исследовал следующие пути:
Polars:
join_asof(): допускает только 1 условие неравенства
join_where() с фильтром(): даже при небольшом окне допуска в стандартной установке Polars не хватает строк (ограничение строк 4,3 Б) во время объединения, а при установке Polars-u64-idx не хватает памяти (512 ГБ)
[*]DuckDB: ASOF LEFT JOIN: также допускает только одно условие неравенства
[*]Numba: Поскольку вышеописанное не сработало, я попытался создать свою собственную функцию join_asof() — см. код ниже. Он работает нормально, но с увеличением длины a становится непомерно медленным. Я пробовал различные конфигурации циклов for/ while и фильтрации, все с одинаковыми результатами.
Теперь у меня заканчиваются идеи... Какой был бы более эффективный способ реализовать это?
Спасибо
import numba as nb
import numpy as np
import polars as pl
import time
У меня есть два кадра данных: [b]a (~600 млн строк)[/b] и [b]b (~2 млн строк)[/b]. Как лучше всего соединить b с a при использовании 1 условия равенства и [b]2 условий неравенства[/b] в соответствующих столбцах? [list] [*]a_1 = b_1 [*]a_2 >= b_2 [*]a_3 >= b_3 [/list] На данный момент я исследовал следующие пути: [list] [*][b]Polars[/b]:
join_asof(): допускает только 1 условие неравенства [*]join_where() с фильтром(): даже при небольшом окне допуска в стандартной установке Polars не хватает строк (ограничение строк 4,3 Б) во время объединения, а при установке Polars-u64-idx не хватает памяти (512 ГБ) [/list]
[*][b]DuckDB[/b]: ASOF LEFT JOIN: также допускает только одно условие неравенства [*][b]Numba[/b]: Поскольку вышеописанное не сработало, я попытался создать свою собственную функцию join_asof() — см. код ниже. Он работает нормально, но с увеличением длины a становится непомерно медленным. Я пробовал различные конфигурации циклов for/ while и фильтрации, все с одинаковыми результатами.
Теперь у меня заканчиваются идеи... Какой был бы более эффективный способ реализовать это? Спасибо import numba as nb import numpy as np import polars as pl import time