Учитывая два файла a и b, каждый из которых хранит 5 миллиардов URL-адресов, каждый URL-адрес занимает 64 байта, а предел памяти составляет 4 ГБ, сможете ли вы найти общий URL-адрес файлов a и b?
Учитывая два файла a и b, каждый из которых хранит 5 миллиардов URL-адресов, каждый URL-адрес занимает 64 байта, а предел памяти составляет 4 ГБ, сможете ли вы найти общий URL-адрес файлов a и b?

Если ограничения на память нет, вы можете сначала прочитать все URL-адреса из файла a в памяти и поместить их в HashSet, а затем прочитать URL-адреса из файла b. При каждом чтении URL-адреса оценивается, существует ли этот URL-адрес. в HashSet. Если он существует, то этот URL-адрес является общим URL-адресом этих двух файлов, в противном случае это не так.

Поскольку вопрос требует, чтобы объем памяти был всего 4 ГБ, а размер каждого файла составлял 5 миллиардов * 64Б = 5 * 64 ГБ = 320 ГБ, что намного превышает лимит памяти, поэтому невозможно прочитать все URL-адреса в память при один раз. В это время вы можете использовать метод разделенного пакетного чтения. Ниже представлены два часто используемых метода:

Метод 1: Хэш-метод

Найдя хэш-значение URL-адреса и поместив URL-адреса с одинаковым значением хеш-функции в отдельный файл, 5 миллиардов URL-адресов можно разложить на меньшее количество URL-адресов, а затем прочитать в памяти для одновременной обработки. Конкретная реализация. идея заключается в следующем:

Сначала просмотрите файл a и найдите хэш для каждого ul. значение и хешируется в 1000 файлов. Метод решения: h=hash(url)%1000, а затем в соответствии с. Hash Результаты этих url Хранятся в файле fa, посредством хеширования, все URL будет распределен между 1000 файлами (fa0, fa2, fa3,..., fa999). Размер каждого файла примерно 300Мб. Аналогично изменяем. url также хэшируются в файл с использованием того же метода расчета, все URL будет распределен среди 1000 (fb0, fb1, fb2,..., fb999) в файле. Очевидно, с fa0 в том же u1 может существовать только в fb0 середина,поэтому,Просто найдите файлы отдельноfaiиfbi(0<i<999)в том жеurl Вот и все.

Кроме того, если после хеш-обработки все еще остаются небольшие файлы, занимающие более 4 ГБ памяти, тот же метод можно использовать для разделения файлов на более мелкие файлы для обработки.

Метод 2: метод фильтра Блума

Подобные проблемы встречаются во многих местах в повседневной жизни. Например, при разработке компьютерных программных систем часто необходимо определить, находится ли элемент в наборе программного обеспечения для обработки текста; Английское слово написано правильно ; В ФБР — указано ли имя подозреваемого в списке подозреваемых в веб-сканерах, был ли посещен URL-адрес и т. д.

Для решения этих проблем,Самое прямое решение — хранить все элементы набора в компьютере.,Всякий раз, когда встречается новый элемент,Просто объедините это ссередина Элементы Вот и все. Хотя этот метод может выполнить задачу точно, существует проблема: слишком много сравнений и эффективность относительно низкая. Когда объем данных невелик, эта проблема низкой эффективности не является существенной, но когда. Когда объем данных огромен, например, при обработке больших объемов данных, проблема низкой эффективности хранения становится очевидной. Например, почтовым ящикам всегда необходимо фильтровать спам. Один из способов сделать это — записывать электронные письма, рассылающие спам. адрес, но поскольку эти отправители будут продолжать регистрировать новые адреса, если используется хеш-таблица, в ней будет храниться 100 миллионов. Email адрес, вообще говоря, каждого Emal Адрес должен быть занят 16B, поэтому всего необходимо 100 миллионов * 16B, что составляет около 1,6 ГБ. Обычный сервер не может хранить такой большой объем информации, если это не суперкомпьютер.

Фильтр Блума — эффективный способ решения этой проблемы. Это эффективная по пространству и времени структура случайных данных, используемая для определения принадлежности элемента множеству. Но это также создает проблему: точность приносится в жертву. Фильтр Блума жертвует точностью в обмен на повышение эффективности использования пространства и времени. Когда он определяет, что элемент не принадлежит этому набору, элемент не должен принадлежать этому набору; когда он определяет, что элемент принадлежит этому набору, элемент не обязательно принадлежит этому набору. В частности, существует две возможности результатов запроса, а именно «не принадлежит этому набору (определенно правильно)» и «принадлежит этому набору (возможно, неправильно)». Таким образом, фильтр Блума подходит для приложений, в которых допускается низкий уровень ошибок.

Его основной принцип — комбинированное использование битовых массивов и хеш-функций. В частности, во-первых, фильтр Блума представляет собой битовый массив, содержащий m бит. Каждый бит массива инициализируется значением 0, а затем определяются k различных хеш-функций. Каждая функция может сопоставлять элементы набора с битовым массивом кого-либо. Когда элемент вставляется в коллекцию, k бит в битовом массиве могут быть получены в соответствии с k хэш-функциями, и эти биты устанавливаются в 1. Если вы запрашиваете, принадлежит ли элемент множеству, вы можете получить k битов в битовом массиве на основе k хеш-функций. Если некоторые биты не равны 1, то элемента определенно нет. this set ; Если все эти k бит равны 1, то элемент может находиться в этом наборе (при вставке других элементов эти позиции могут быть установлены в 1, что генерирует ошибку).

Следовательно, сложность использования фильтра Блума заключается в том, как определить размер битового массива m и хэш-функции на основе количества входных элементов n. Когда количество хеш-функций k=(In2)*(m/n), частота ошибок является наименьшей. Когда частота ошибок не превышает E, m должно быть как минимум равно n*lg(1/E). для представления любых n элементов. Но m должно быть больше, поскольку по крайней мере половина битового массива должна быть равна 0, тогда m должно быть больше или равно n*lg(1/E)*lge, что примерно в 1,44 раза больше n*lg(1E). (lg означает логарифм по основанию 2).

Например, если предположить, что E равно 0,01, то есть частота ошибок равна 0,01, то m должно быть примерно в 13 раз больше n, поэтому k равно примерно 8 (примечание: единицы измерения m и n разные, единицей измерения m является бит). , а n — в единицах количества элементов). Обычно длина одного элемента составляет много бит, поэтому использование фильтра Блума обычно экономит память.

Преимущество фильтра Блума в том, что он имеет хорошую экономию пространства и времени. Время его вставки и запроса постоянно, и сам элемент не сохраняется, поэтому он имеет хорошую безопасность. Однако эти преимущества достигаются за счет точности. Когда вставлено больше элементов, вероятность ошибочного решения о том, что «элемент принадлежит этому набору», увеличивается. Кроме того, фильтр Блума может только вставлять элементы, но не может удалять элементы, поскольку результаты хэширования нескольких элементов могут использовать один и тот же бит в структуре фильтра Блума. Удаление элемента может повлиять на обнаружение нескольких элементов. Следовательно, фильтр Блума можно использовать для реализации словаря данных, определения веса данных или поиска пересечения наборов.

По этому вопросу: 4 ГБ памяти могут представлять 34 миллиарда бит. Используйте метод фильтра Блума, чтобы сопоставить URL-адрес в файле a с этими 34 миллиардами бит, а затем просмотрите файл b, чтобы определить, существует ли он. Однако при использовании этого метода будет определенная доля ошибок.

Этот метод можно использовать только в том случае, если допускается определенная частота ошибок.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose