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






Что ж, ваши теги указывают, что вы должны делать (тег, о котором я говорю, - "индексирование").
По сути, у вас должны быть отдельные файлы, в которых будут содержаться индексы данных. В нем будут строки данных, которые вы ищете, а также позиции файла и байтов, в которых он находится.
Затем вы получите доступ к индексу, найдите свое значение, а затем найдите место (а) в исходном файле (ах) для строки данных и выполните обработку оттуда.
Однако я не знаю, как именно индексировать? Поиск мог быть от 000 до 999 (100 цифр), я бы не знал, как индексировать. Все можно было обыскать.
Есть ли в этом файле какая-то структура? Или вы ищете произвольные строки данных?
Файлы представляют собой обычные текстовые файлы со 100% числовыми данными. Как уже говорилось, каждый файл содержал 250 КБ данных. Первый файл (1.txt) содержит 1-250 КБ, следующий (2.txt) 250 001-500 КБ и т. д.
и да, произвольные строки данных ищутся и кешируются.
Для хорошего ответа может потребоваться более конкретная информация.
Как долго длится поисковый запрос? 1 цифра? 10 цифр? Произвольная длина?
Насколько «быстро» достаточно быстро? 1 секунда? 10 секунд? 1 минута?
Сколько всего запросов в секунду / минуту / час вы ожидаете?
Как часто меняются данные? Каждый день? Час? Постоянно?
Когда вы говорите «несколько вхождений», это звучит так, как будто вы имеете в виду перекрывающиеся совпадения.
Какова «ценность» ответа и для скольких людей?
Миллиард - это уже не то, что было раньше, чтобы вы могли просто проиндексировать всю ерунду и получить индекс, который в 10 или даже 100 раз превышает исходные данные. Но если данные меняются поминутно, это будет означать, что вы прожигали больше циклов для создания индекса, чем для его поиска.
Количество времени и денег, которые вы вкладываете в решение, зависит от его ценности.
Данные будут меняться только раз в месяц. 1) 3–100 разрешенных цифр 2) предпочтительно менее секунды 3) 100 запросов в минуту (результаты кешируются) 4) ежемесячно 5) да (12341234, если я искал «123», мне нужны два местоположения, 0 и 4) 6) На данный момент неизвестно.
В 10-100 раз больше исходных данных. Я бы предпочел оставаться ниже 50-кратного оригинала, но могу подняться и до 125-кратного.
Тебе обязательно стоит завести девушку. Помимо того, что он помогает вам лучше проводить время, он может растолстеть, не взрываясь. Да, и то же самое касается баз данных.
Все вопросы Питера Роуэлла относятся к делу. Если вам абсолютно необходим нестандартный ответ, попробуйте grep. Вы даже можете запустить его из PHP, если хотите. Это на порядки быстрее, чем strpos. На самом деле мы довольно хорошо использовали его в качестве решения для чего-то, что не могло иметь дело с индексированием.
Но опять же, все вопросы Питера по-прежнему актуальны. Я отвечу на них, прежде чем погрузиться в решение.
Я уже ответил в комментариях? Но спасибо, посмотрю в grep.
Будет ли работать хеш-функция / таблица? Или массив / дерево суффиксов?
Я просто пытаюсь найти решение, мне не нужен код, я могу его написать сам, я просто пытался найти лучший «маршрут».