@iddimon3

Поиск по большим файлам python?

Ситуация такая: Есть большой файл весом 2гб.

Нужно вытаскивать от туда данные используя python.
Линейный поиск не подходит, сделал бинарный поиск по id, но самый главный недостаток, что можно искать только по этому id. Я хочу искать по содержимому в строке.
Хочу +- такую же скорость как от бинарного поиска, как это можно реализовать?
  • Вопрос задан
  • 327 просмотров
Пригласить эксперта
Ответы на вопрос 3
Maksim_64
@Maksim_64
Data Analyst
Ну если файл 2гб чем pandas то не устраивает, можно еще и pandas ускорить использовать polars, у него схожий синтакс c pandas но поддерживает параллельное выполнение. Что для pandas что для polars такие выборки это будет одна коротенькая строчка кода.

2гб не проблема в память загрузить, но и если бы файл был на много больше и pandas и polars поддерживают чтение файлов по частям. Вообще если нужна серьезная скорость, polars ,будет номер один там не numpy массив, а Rust Arrow. Не факт что тут polars нужен, ну вот глянь https://www.makeuseof.com/pandas-vs-polars-which-i... на сколько pandas быстрый, но polars выборка рядов по условию в 5 раз быстрее, а например применение функции, к столбцу или фрейму в 30 раз быстрее.
Ответ написан
Комментировать
@12rbah
Хочу +- такую же скорость как от бинарного поиска, как это можно реализовать?
Никак, у бинарного поиска высокая скорость поиска за счет того, что всё отсортировано. В произвольном массиве такого не достичь.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
1) Ну. Как бы я делал. Наверное проще загрузить это в SQLite и проиндексировать. Как то так.

file.csv
id;name;phone;price
1;Игорь;79287777777;20
2; Дмитрий;79287777888;25
...

В базе
sqlite> create table tab1(id text,name text,phone text,price text);
sqlite> .mode csv
sqlite> .separator ";"
sqlite> .headers off
sqlite> .import file.csv tab1

Это одноразовая операция и ее можно сделать вручную.
Желательно создать композитный индекс по 2 полям
sqlite> create index idx1 on tab1(name,price);
А дальше из python подключиться к SQLite и гонять запросы вида
SELECT * from tab1 WHER name='Игорь' AND price='20'


2) Можно еще придумать сценарий с загрузкой таблицы в Python dictionary но это наверное
увеличит нагрузку на память. Может вместо 2Гб будет 10Гб. Who knows! Вобщем это повод для
экспериментов с замером памяти. Кроме того dictionary жестко нас привяжет к полям name + price
и это будет неудобно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы