Поиск больших данных, все числовые, 1 миллиард байт в PHP

Мне было интересно, как я могу быстро найти строку данных размером до 1 миллиарда байтов данных. Данные все числовые. В настоящее время у нас есть данные, разделенные на 250 тыс. файлов, и поиск с использованием strpos (самая быстрая встроенная функция) в каждом файле, пока он что-то не найдет. Есть ли способ, которым я могу индексировать, чтобы он работал быстрее? Какие-либо предложения?

В конце концов я хотел бы найти несколько вхождений, что на данный момент будет сделано с параметром смещения в strpos.

Любая помощь обязательно приведет к признанию там, где это необходимо.

Спасибо! - Джеймс Хартиг


person James Hartig    schedule 13.01.2009    source источник
comment
Я просто пытаюсь найти решение, мне не нужен код, я могу написать его сам, я просто пытался найти лучший маршрут.   -  person James Hartig    schedule 13.01.2009


Ответы (5)


Ну, ваши теги указывают, что вы должны делать (тег, о котором я говорю, это «индексирование»).

По сути, у вас должны быть отдельные файлы, в которых будут индексы для данных. В нем будут строки данных, которые вы ищете, а также позиции файла и байта, в которых он находится.

Затем вы должны получить доступ к индексу, найти свое значение, а затем найти местоположение (я) в исходном файле (файлах) для строки данных и обработать оттуда.

person casperOne    schedule 13.01.2009
comment
Однако я не знаю, как именно я должен индексировать? Поиск может быть где угодно от 000 до 999 (100 цифр), я не знаю, как индексировать. Что угодно можно было обыскать. - person James Hartig; 13.01.2009
comment
Хорошо, есть ли какая-то структура в этом файле? Или вы ищете произвольные строки данных? - person casperOne; 13.01.2009
comment
Файлы представляют собой обычные текстовые файлы со 100% числовыми данными. Как уже говорилось, каждый файл содержал 250 КБ данных. Первый файл (1.txt) содержит 1–250 КБ, следующий (2.txt) 250 001–500 КБ и т. д. - person James Hartig; 13.01.2009
comment
и да произвольные строки данных ищутся и кэшируются. - person James Hartig; 13.01.2009

Хороший ответ может потребовать от вас большей конкретики.

  1. Какова длина поискового запроса? 1 цифра? 10 цифр? Произвольная длина?

  2. Насколько «быстро» достаточно быстро? 1 секунда? 10 секунд? 1 минута?

  3. Сколько всего запросов в секунду/минуту/час вы ожидаете?

  4. Как часто меняются данные? Каждый день? Час? Постоянно?

  5. Когда вы говорите «несколько вхождений», это звучит так, как будто вы имеете в виду перекрывающиеся совпадения.

  6. Какова «ценность» ответа и для скольких людей?

Миллиард — это уже не то, что было раньше, так что вы можете просто проиндексировать все это дерьмо и получить индекс, который в 10 или даже в 100 раз превышает исходные данные. Но если данные меняются каждую минуту, это будет означать, что вы тратите больше циклов на создание индекса, чем на его поиск.

Количество времени и денег, которые вы вкладываете в решение, зависит от ценности этого решения.

person Peter Rowell    schedule 13.01.2009
comment
Данные будут меняться только раз в месяц. 1) разрешено 3–100 цифр 2) предпочтительно менее секунды 3) 100 запросов в минуту (результаты кэшируются) 4) ежемесячно 5) да (12341234, если я искал 123, я хочу два местоположения, 0 и 4) 6) неизвестно в момент. - person James Hartig; 13.01.2009
comment
В 10-100 раз больше исходных данных. Я бы предпочел остаться ниже 50-кратного оригинала, однако я могу подняться до 125-кратного. - person James Hartig; 13.01.2009

Тебе обязательно нужно завести девушку. Помимо того, что он помогает вам лучше проводить время, он может толстеть, не лопаясь. О, и то же самое касается баз данных.

person Cristian Libardo    schedule 13.01.2009

Все вопросы Питера Роуэлла относятся к делу. Если вам абсолютно необходим нестандартный ответ, попробуйте grep. Вы даже можете выполнить его из PHP, если хотите. Это на несколько порядков быстрее, чем strpos. На самом деле мы довольно хорошо использовали его как решение для чего-то, что не могло справиться с индексацией.

Но опять же, вопросы Питера по-прежнему применимы. Я бы ответил на них, прежде чем погрузиться в решение.

person conceptDawg    schedule 13.01.2009
comment
Я уже ответил в комментариях? Но спасибо, я посмотрю на grep. - person James Hartig; 13.01.2009

Будет ли работать хэш-функция/таблица? Или суффиксный массив/дерево?

person James Hartig    schedule 13.01.2009