比如下面这个问题:列出所有家用电器和食品类订单中总额排在前200名的交易记录,按商品名称排列。订单记录来源于Order_Appliances.txt和Order_Foods.txt两个文本文件,需要先把两个表中的数据汇总后,取得订单总额前200名的订单记录,再按照商品名称排序。
|
A |
1 |
=file("Order_Appliances.txt").import@t() |
2 |
=file("Order_Foods.txt").import@t() |
3 |
=A1|A2 |
4 |
=A3.top(200,-Amount, ~).new(ID, PName,Type,Date,Amount) |
5 |
=A4.sort(PName) |
其中各单元格运算结果如下:
A1中的序表为Order_Appliances.txt中的订单记录:
A2的序表为Order_Foods.txt中的订单记录:
A3将前面两个序表中的记录简单合并在一起,为下一步的过滤做准备。
A4中选出销售额前200名的订单记录,并从中选出需要的字段生成新序表。由于这里需要按销售额从大到小排列,因此在top() 函数中,Amount前面有负号,此时获得的结果是按照销售额排序的:
A5中,按照需要,将销售额前200名的订单记录按照商品名称排序:
实际上,我们最终需要的结果仅是A5中的数据。在A4整理出所有订单记录的必要信息之后,原始表格A1与A2中的信息就已经不再需要了。如果在中间数据获得之后,清除掉不再使用的初始数据,可以降低对系统内存的占用,使得运算更为稳定。
因此,网格程序可以按照下面的方法整理:
|
A |
B |
C |
1 |
=file("Order_Appliances.txt").import@t() |
|
|
2 |
=file("Order_Foods.txt").import@t() |
|
|
3 |
=A1|A2 |
>A1.reset() |
>A2=null |
4 |
=A3.top(200,-Amount, ~).new(ID, PName,Type,Date,Amount) |
>A3=null |
|
5 |
=A4.sort(PName) |
>A4=null |
|
当把单元格值设为null时,单元格中的值就会被完全清空,如C3和B4中的语句。C3中的语句将A2中的单元格值清空,且B4将A3中引用食品订单记录的数据同样清空后,原始的食品订单就不会保持在内存中了。
在B3中的T.reset() 函数则有所不同,它会清除掉序表中的所有记录,但仍保留其数据结构,执行完B3后A1的值如下:
在清除格值时,可以根据需要选择这两种方法,其中将格值置空的方法更为常用,只有确实需要保留序表的数据结构时,才应该选用T.reset()。
值得注意的是B5中的语句,在这里虽然把A4中的值置空,却是无法达到减少内存占用的效果的。原因在于,A5返回的结果是一个排列,而这个排列中的记录引用均来自于A4中的序表,即使A4置空,这些记录也仍然会在A5中引用,是不会被清除的。因此,如果利用将单元格值置空来清除内存,一定要明确原单元格中的数据是否仍然被使用。
另外需要说明的是,在A5中对A4中的记录进行了排序操作,但是,在排序操作中,并不会产生新记录。在A5中存储的只是记录排序后的指针,对内存的占用较小,并不用担心这种情况造成的内存损耗。