![]() |
1
3
你不能真的创建这么长的列表,然后尝试将其转换为整数。Erlang中的列表是 linked list 每个元素包含该值和下一个元素的地址。对于64位系统,这意味着每个元素16个字节:
64位系统上的字大小:
因此,用1.0e9元素构建列表需要1.6e10字节或15 Gb:
这很可能超出了单个进程在大多数系统上的分配能力。 唯一的方法是应用某种数学公式,通过算法来创建这样一个数字。一个简单的实现将简单地乘以10并将数字多次相加:
结果:
但随着数字数量的增加,速度呈指数级下降,因此任何超过数十万个数字的数据都可能计算成本太高。 您也可以尝试生成二进制文件而不是列表,因为二进制文件是 implemented on consecutive bytes 在存储器段中,例如:
但在计算上,这将类似于先前的解决方案——一个大二进制可以很快地构建,但后来将其转换为整数在计算上很昂贵。 你可以试着问一个关于算法的问题,用最少的步骤或 Mathematic SE 然后在这里询问这种算法的具体实现。 |
![]() |
2
1
使用中间列表是没有用的,位串不能直接转换为整数,所以我认为它也没有用,所以最好的解决方案是直接使用大num。 假设您想创建一个整数,该整数用十进制表示法表示,重复N次宽度为width的Pattern:
具有
第一个简单的实现,通过移位和添加模式N次来计算结果,但对于大N来说效率很低。这里有一个实现(请注意,为了衡量我避免打印结果的性能,否则shell将在iolist中转换整数):
这样你就得到了结果:
时间非常长(1000000分钟为5分钟),并且呈指数增长。 减少这种情况的想法是以指数方式减少要执行的操作数。这个更聪明的版本使用的模式在每次迭代时宽度加倍,并在需要时连接到当前结果(我使用了N的2次幂分解):
结果要好得多:1000000只需5秒,由于乘法运算,n*n仍在增加。
|
![]() |
mritalian · Erlang ETS内存碎片 7 年前 |
![]() |
david · Erlang:从主机名获取ip地址 7 年前 |
![]() |
Matt · 有没有办法访问GenServer的状态? 7 年前 |
![]() |
Chris W · 具有并行HTTP请求的Erlang网络问题 7 年前 |