批量数据生成

anu*_*rag 3 awk regular-expression

我需要生成近 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)
}' 
Run Code Online (Sandbox Code Playgroud)

但它没有生成超过 599160237 条记录并且进程被自动杀死

小智 5

您可以使用 GNU seq+sort首先生成一个唯一的 1B 整数列表(按顺序),然​​后sort -R随机打乱它们)。虽然这不是 CPU 高效的,但它与内存无关,因为 sort 将使用尽可能多的可用内存,然后恢复到临时文件。

这将需要几分钟(取决于您机器的 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
Run Code Online (Sandbox Code Playgroud)

如果您可以访问具有足够 RAM 的机器,则可以使用 GNU shuf

$ shuf -i 1-1000000000 > 1B.random.txt
Run Code Online (Sandbox Code Playgroud)

根据经验,shuf我的机器需要~8GB 的​​空闲内存和~6 分钟的运行时间。