ほぼ10億の一意の整数レコードを生成する必要があります。私はawkを試しましたが、500万以上のレコードが生成されませんでした。私が今まで試したことは次のとおりです。
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以上のレコードが生成されなかったため、プロセスは自動的に終了しました。
ベストアンサー1
GNU seq
+を使用sort
して、最初に一意の1B整数リスト(順番に)を作成してからランダムに混在させるsort -R
ことができます。これはCPU効率的ではありませんが、ソート時に使用可能なメモリを最大限に使用してから一時ファイルに戻すため、メモリに依存しません。
これは数分かかります(マシンのCPU / Ram /ディスクによって異なります)。
$ 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
RAMが十分なコンピュータにアクセスできる場合は、GNUを使用できますshuf
。
$ shuf -i 1-1000000000 > 1B.random.txt
経験上shuf
、私のコンピュータには約8GBの空きメモリと約6分のランタイムが必要です。