我编写了以下随机数生成器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
我这样运行:
./generator.sh 1000000000 101 > data.txt
在[0,100]中生成id行和随机数的1B行,并将此数据存储在文件data.txt
中。
我想要的输出是:
1 39
2 95
3 61
4 27
5 85
6 44
7 49
8 75
9 52
10 66
...
它适用于少量行,但是对于1B,我得到以下OOM错误:
./generator.sh:xrealloc:../bash/subst.c:5179:无法分配18446744071562067968字节(分配4299137024字节)
我程序的哪个部分会产生错误?
我怎么能逐行编写data.txt
文件?
我尝试将echo
行替换为:
echo "$i $((RANDOM%$2))" >> $3
其中$ 3是data.txt
,但我认为没有区别。
答案 0 :(得分:5)
问题在于您的for
循环:
for i in $(seq 1 $1)
这将首先展开$(seq 1 $1)
,创建一个非常大的列表,然后将其传递给for
。
然而,使用while
,我们可以逐行读取seq
的输出,这将占用少量内存:
seq 1 1000000000 | while read i; do
echo $i
done
答案 1 :(得分:4)
$(seq 1 $1)
在迭代之前计算整个列表。因此需要内存来存储10^9
个数字的整个列表,这很多。
我不确定你是否可以让seq
懒惰地运行,即只在需要时获取下一个号码。你可以做一个简单的for循环:
for ((i=0; i<$1;++i))
do
echo "$i $((RANDOM%$2))"
done
答案 2 :(得分:4)
如果你想要它快,这应该有效。
您需要使用表格
使用g ++编译它g++ -o <executable> <C++file>
例如我这样做了
g++ -o inseq.exe CTest.cpp
CTest.cpp
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <sstream>
int main (int argc,char *argv[])
{
std::stringstream ss;
int x = atoi(argv[1]);
for(int i=1;i<=x;i++)
{
ss << i << "\n";
if(i%10000==0)
{
std::cout << ss.rdbuf();
ss.clear();
ss.str(std::string());
}
}
std::cout << ss.rdbuf();
ss.clear();
ss.str(std::string());
}
为1000000行文件提供的每种方法的最低速度为3次测试。
$ time ./inseq 1000000 > file
real 0m0.143s
user 0m0.131s
sys 0m0.011s
$ cat Carpet.sh
#!/bin/bash
seq 1 $1 | while read i; do
echo $i
done
$ time ./Carpet.sh 1000000 > file
real 0m12.223s
user 0m9.753s
sys 0m2.140s
$ cat Hari.sh
#!/bin/bash
for ((i=0; i<$1;++i))
do
echo "$i $((RANDOM%$2))"
done
$ time ./Hari.sh 1000000 > file
real 0m9.729s
user 0m8.084s
sys 0m1.064s
从结果中可以看出,我的方式稍微快了大约60-70 *。
因为python很棒
$ cat Py.sh
#!/usr/bin/python
for x in xrange(1, 1000000):
print (x)
&#39;
$ time ./Py.sh >file
real 0m0.543s
user 0m0.499s
sys 0m0.016s
比c ++慢4 *所以如果文件需要一个小时才能完成,这两行会占用4个。
决定在1000000000行文件上试用Python和c ++
对于无CPU密集型任务,这似乎是使用lumpt of cpu
PID USER %CPU TIME+ COMMAND
56056 me 96 2:51.43 Py.sh
Python的结果
real 9m37.133s
user 8m53.550s
sys 0m8.348s
c ++的结果
real 3m9.047s
user 2m53.400s
sys 0m2.842s