vef*_*hym 3 unix bash shell out-of-memory
我编写了以下随机数生成器shell脚本:
for i in $(seq 1 $1) #for as many times, as the first argument ($1) defines...
do
echo "$i $((RANDOM%$2))" #print the current iteration number and a random number in [0, $2)
done
Run Code Online (Sandbox Code Playgroud)
我这样运行:
./generator.sh 1000000000 101 > data.txt
Run Code Online (Sandbox Code Playgroud)
在[0,100]中生成1行ID和随机数的行,并将该数据存储在文件中data.txt
.
我想要的输出是:
1 39
2 95
3 61
4 27
5 85
6 44
7 49
8 75
9 52
10 66
...
Run Code Online (Sandbox Code Playgroud)
它适用于少量行,但对于1B,我得到以下OOM错误:
./generator.sh:xrealloc:../bash/subst.c:5179:无法分配18446744071562067968字节(分配4299137024字节)
我程序的哪一部分会产生错误?我怎么能data.txt
逐行写文件?我试过更换echo
线路:
echo "$i $((RANDOM%$2))" >> $3
Run Code Online (Sandbox Code Playgroud)
3美元data.txt
,但我认为没有区别.
问题是你的for
循环:
for i in $(seq 1 $1)
Run Code Online (Sandbox Code Playgroud)
这将首先展开$(seq 1 $1)
,创建一个非常大的列表,然后传递给它for
.
while
但是,使用我们可以读取seq
逐行输出,这将占用少量内存:
seq 1 1000000000 | while read i; do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
$(seq 1 $1)
在迭代之前计算整个列表。所以需要内存来存储整个10^9
数字列表,这是很多的。
我不确定您是否可以seq
延迟运行,即仅在需要时才获取下一个数字。您可以做一个简单的 for 循环:
for ((i=0; i<$1;++i))
do
echo "$i $((RANDOM%$2))"
done
Run Code Online (Sandbox Code Playgroud)