Генерация массовых данных

Мне нужно создать почти 1 миллиард записей уникальных целых чисел. Я пробовал с awk, но он не генерирует более 5 миллионов записей. Пожалуйста помоги. Ниже я попытался до сих пор –

awk -v loop=10000000000 -v range=10000000000 'BEGIN{ srand() do { numb = 1 + int(rand() * range) if (!(numb in prev)) { print numb prev[numb] = 1 count++ } } while (count<loop) }' 

Но он не генерирует более 599160237 записей, и процесс автоматически убит

4 Solutions collect form web for “Генерация массовых данных”

Вы можете использовать sort GNU seq +, чтобы сначала создать список уникальных целых чисел 1B (в последовательном порядке), а затем sort -R чтобы случайным образом перетасовать их). Несмотря на то, что это не является эффективным с точки зрения ЦП, это не зависит от памяти, поскольку сортировка будет использовать столько памяти, сколько доступно, а затем вернуться к временным файлам.

Это займет несколько минут (в зависимости от процессора / памяти / диска вашего компьютера):

 $ seq 1000000000 > 1B.txt $ ls -lhog 1B.txt -rw-rw-r-- 1 9.3G Dec 26 17:31 1B.txt $ sort -R 1B.txt > 1B.random.txt 

Если у вас есть доступ к машине с достаточной ОЗУ, вы можете использовать GNU shuf :

 $ shuf -i 1-1000000000 > 1B.random.txt 

Эмпирически, необходимо было ~ 8 ГБ свободного shuf и ~ 6 минут работы на моей машине.

Лучше использовать программу, которая не будет выделять большую часть памяти для выполнения задачи. Однако есть проблема с генерацией случайных чисел: если вам нужны совершенно случайные числа, тогда вам нужно использовать «хороший» источник случайных чисел, например / dev / urandom.

Я думаю, что эта программа C может помочь вам в решении этой задачи. Он генерирует числа в прогоне и с тремя аргументами, которые вы указываете: start int, end int и количество из них для генерации. Итак, чтобы генерировать 100 int в диапазоне в (0..200), вы делаете:

 ./mkrnd 0 200 100 

Вероятно, вам захочется перенаправить файл, так что

 ./mkrnd 0 200 100 >randomints.txt 

Компиляция проста, просто сделайте gcc mkrnd.c -o mkrnd (или я могу скомпилировать его для вас).

Полагаю, что он достаточно быстр, но мне все же потребуются часы для работы. Для меня на Athlon64 5000+:

 % time null ./mkrnd 0 1000000000 10000000 real 0m33.471s user 0m0.000s sys 0m0.000s 

Удалите #if 0 … #endif, чтобы он захватил случайные целые числа из / dev / urandom (возможно, медленнее).

И о требованиях к памяти: он занимает всего 4K RSS в musl system во время всего его времени исполнения.

EDIT: замена gettimeofday на clock_gettime дает двойную скорость.

в python3.4 вы можете создавать и играть с такими огромными цифрами:

  #!/bin/python3.4 import random print(random.sample(range(1, 1000000000000),1000000000)) 

это напечатает миллиард уникальных номеров

если есть проблема с памятью выделения огромной выборки, то можно использовать диапазон и печатать числа в цикле, но это будет в последовательности, а не случайной:

  x=range(1, 1000000000000) for i in x: print (i) #or process i , whatever the operation is. 

Причина, по которой может быть убит процесс, может заключаться в том, что awk имеет ошибку / ограничение в массивах, которые ваш код попадает, или ваш код просто настолько занимает много места, что он попадает на какой-то предел на основе процесса.

Я имею в виду, вы пытаетесь построить массив с максимальным индексом 10 миллиардов (на основе range ) с 1 миллиардом определенных значений. Таким образом, awk необходимо потенциально зарезервировать место для 10 миллиардов переменных. Я недостаточно осведомлен, чтобы сказать, сколько пространства это означало бы, но 10 миллиардов 16-битных целых чисел будут означать 18,5 ГБ, и даже если awk умнее в создании такого разреженного массива, для этого потребуется более 1,8 ГБ, чтобы хранить номера вы создаете.

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

Как избавиться от огромных потребностей в памяти?

А. Гордон представляет один вариант, полагаясь на последовательность и просто перетасовывая ее для случайности. Это хорошо работает, когда есть требование, чтобы результат действительно был числом, и вы хотите, чтобы они были из заданного диапазона. Если диапазон более сложный, чем от одного до N, вы можете сгенерировать последовательность с awk а затем передать его для sort -R . Также см. Мой комментарий к ответу о том, как сделать диапазон и количество произведенных чисел разными.

Один из вариантов может заключаться в использовании криптографической (хеш-функции) для создания случайных чисел, но в этом случае вы не можете определить диапазон от 1 до N, поскольку эти функции обычно производят вывод N бит, и вы не можете калечить результаты без риска создания столкновения (дублирующее количество в наборе). Тем не менее, гарантированные функции гарантируют, что он легко выдаст 1 миллиард уникальных выходов (поскольку эти хеш-функции предназначены для того, чтобы не производить одинаковый вывод дважды даже при чрезвычайно большом количестве повторные вызовы). В зависимости от реализации их вывод может быть не числом, а строками, и можно преобразовать вывод строки в числа, но поскольку их размер вывода обычно достаточно велик, тогда диапазон чисел, полученных в результате преобразования, будет действительно огромным. Вы можете начать с этого вопроса Stackoverflow, если вам интересно изучить этот вариант.

Если вы рискуете иметь вероятность столкновения, даже если это маловероятно, вы можете попробовать использовать хороший источник случайности (/ dev / urandom – один из вариантов), чтобы генерировать 1 миллиард чисел. Я не знаю, насколько вероятно, что вы можете получить от этого 1 миллиард уникальных чисел, но попробовать его наверняка стоило бы попробовать. Однако нет эффективного с точки зрения памяти способа указать, есть ли дубликат в наборе результатов, поскольку для этого требуется наличие всех чисел в памяти для сравнения.

  • awk - как игнорировать подстановочные матчи?
  • Параметр awk split char
  • Build table - добавить столбец в зависимости от имени файла
  • Как отсортировать блоки строк с определенной строкой из блока?
  • Получите процент использования для точки монтирования
  • Подсчет запятыми разделенных символов подряд
  • Как я могу перечислить второе последнее слово, найденное в последовательности операторов в awk
  • bash ignorecase сопоставить шаблон в файле и цвет этой строки, распечатать все на экране
  • awk-манипуляция файлом
  • извлечь url между 2 строками в файле
  • Где получить новую строку после запуска `sub` в awk
  • Interesting Posts

    Как запустить скрипт после инициализации OpenVPN?

    Как команда su маскирует / защищает мой пароль от отображения на экране?

    Как сделать принтер, добавленный через CUPS, отображаться в списке принтеров по умолчанию в Centos

    Новичок борется с grep, sed, awk для фильтрации html

    Используйте SED или AWK для перемещения строки в новый столбец и строку

    Начните два сервера X при загрузке на RHEL

    что я должен знать при использовании команды mailx

    Ошибка условия exim "$ {env не является известным оператором"

    CentOS 6 iptables nat router

    Диспетчер событий в bash (Ubuntu Gnu / Linux)

    Наследование прав на запись группы, но не выполнение для файлов, на OmniOS (Illumos) с использованием ZFS ACL

    При записи нового изображения iso на CD (тип rw) все же компакт-диск отражает старое содержимое!

    Создайте группу томов из логического тома вместо физического тома

    Супер легкий сценарий для приема входящей электронной почты и пересылки сценария

    Установка Texlive на ПК-BSD 8.2

    Linux и Unix - лучшая ОС в мире.