Создание уникального списка из набора данных, слишком большого для размещения в памяти - PullRequest
5 голосов
/ 05 января 2011

У меня есть список из 120 миллионов записей размером около 40/50 байт каждая, что составляет около 5,5 / 6 гигабайт свободного пространства памяти, не включая дополнительное пространство, необходимое для хранения массива в памяти.

Я бы хотел убедиться, что этот список уникален. Я попытался сделать это, создав хэш-сет и добавив в него все записи по одной.

Когда я получаю около 33 миллионов записей, мне не хватает памяти, и создание списка замедляется до ползания.

Есть ли лучший способ своевременно отсортировать этот огромный список записей? Единственное решение, о котором я могу подумать, - это использовать большой большой экземпляр Amazon EC2 в течение часа.

Спасибо

Ответы [ 3 ]

6 голосов
/ 05 января 2011

Если вы просто пытаетесь проверить уникальность, я бы просто разделил входную последовательность на сегменты, а затем проверил каждый сегмент отдельно.

Например, предполагая, что вы загружаете данные из файла, вы можете передать входные данные и записать их в 26 различных файлов, по одному на каждую букву, с которой начинается запись (я наивно предполагаю, что каждая запись начинается с AZ - пожалуйста, настройте для вашей реальной ситуации). Затем вы можете проверить уникальность каждого из этих меньших файлов, используя что-то вроде существующего кода - потому что ни один из них не будет слишком большим, чтобы поместиться в память одновременно. Первоначальное группирование гарантирует, что не будет повторяющихся записей в разных сегментах.

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

4 голосов
/ 05 января 2011

Используйте bucket sort для сортировки списка, регулярно сбрасывая часть содержимого контейнеров на диск, чтобы избежать нехватки памяти.Затем последовательно загрузите каждое очищенное ведро и используйте подход HashSet или отсортируйте его и проверьте таким образом.

0 голосов
/ 16 декабря 2016

Вы всегда можете работать в базе данных sqlite с уникальным индексом, так как это может помочь в дальнейшей обработке набора данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...