bigarray

语法

bigarray(dataType|template, [initialSize], [capacity], [defaultValue])

参数

dataType 是大数组的数据类型。

template 是已有的大数组。已有的大数组作为模板,它的数据类型决定了新的大数组的数据类型。

initialSize 是正整数,表示大数组的初始长度,即该大数组新建时的元素数量。如果第一个参数是数据类型,initialSize是必需参数。如果第一个参数是已有的大数组,initialSize是可选参数。

capacity 是正整数,表示大数组的容量,即该大数组新建时系统为该大数组分配的内存(以元素数为单位)。当元素数超过capacity时,系统会自动扩充容量。系统首先会分配当前容量1.2~2倍的内存,然后复制数据到新的内存空间,最后释放原来的内存。

defaultValue 是大数组的默认值。如果不指定默认值,对于多数数据类型,默认值是 0。对于字符串和符号(Symbol),默认值是 NULL。

详情

大数组是专门为进行大数据分析的高级用户设计的。常规的数组使用连续的内存。如果没有足够的连续内存,就会产生内存不足的异常。大数组由许多小的内存块组成,而不是一个大的内存块。所以,大数组缓解了内存碎片问题。但这可能会对某些操作造成轻微的性能损失。对于多数不需要担心内存碎片的问题的用户而言,应该使用常规数组,而不是大数组。

大数组的最小容量是 16 MB。用户可以用 bigarray 函数声明一个大数组。

操作大数组的方法和操作一个常规数组一样。

当我们调用 array 函数时,如果没有足够的连续内存块,或数组占据的内存超过了一个特定的阈值(默认的阈值是 2048 MB),系统会改为创建一个大数组。

例子

$ x=bigarray(INT,10,10000000);
$ x;
[0,0,0,0,0,0,0,0,0,0]

// 默认值设为 1
$ x=bigarray(INT,10,10000000,1);
$ x;
[1,1,1,1,1,1,1,1,1,1]

$ x=bigarray(INT,0,10000000).append!(1..100);
$ x[0];
1
$ sum x;
5050
$ x[x>50&&x<60];
[51,52,53,54,55,56,57,58,59]

$ x=array(DOUBLE, 40000000);
$ typestr x;
HUGE DOUBLE VECTOR

数组和大数组的性能比较:

// 对于顺序操作,数组和大数组的表现几乎相同。
$ n=20000000
$ x=rand(10000, n)
$ y=rand(1.0, n)
$ bx= bigarray(INT, 0, n).append!(x)
$ by= bigarray(DOUBLE,0,n).append!(y);

$ timer(100) wavg(x,y);
Time elapsed: 4869.74 ms
$ timer(100) wavg(bx,by);
Time elapsed: 4762.89 ms

$ timer(100) x*y;
Time elapsed: 7525.22 ms
$ timer(100) bx*by;
Time elapsed: 7791.83 ms

// 对于随机访问,大数组有轻微的性能损失。
$ indices = shuffle 0..(n-1);
$ timer(10) x[indices];
Time elapsed: 2942.29 ms
$ timer(10) bx[indices];
Time elapsed: 3547.22 ms