MATREAD和READ之间有什么区别?

时间:2013-05-13 11:38:50

标签: u2 universe

我需要了解MATREAD和READ之间的区别吗?请提供一个简单的例子,说明在何处以及如何使用它。

2 个答案:

答案 0 :(得分:8)

READ将从磁盘读取记录并将其作为Dynamic Array返回。 MATREAD将从磁盘读取记录并将其作为Dimensioned Array返回。

因此,真正的诀窍是确定哪种数组类型更适用于您的用例。

Dynamic Array本质上是一个字符串,它使用某些字节标记来分隔每个元素(属性/多值/子值)。它非常易于使用,不需要预先声明或调整大小。在缺点方面,if可能比Dimensioned Array慢,主要用于大型记录,或者当你从数组中随机检索属性时 - 我认为是O(n log n)。顺序访问已经过优化,接近Dimensioned Arrays速度。

Dimensioned Array本质上是一个字符串数组(或者在UniVerse的情况下为Dynamic Arrays)。它将每个属性读入数组位置。然后,每个数组位置将由Dynamic Array组成,仅用于该属性的多值/子值位置。 Dimensioned Arrays要求您预先声明它们和阵列位置的数量。根据您运行的风格,如果您尝试读取具有比数组大小更多的属性的记录,则可能会导致运行时错误。另一方面,无论您的访问模式如何,从数组中检索属性都是O(1)。

答案 1 :(得分:2)

MATREADU使用READ捆绑MATPARSE。这些将动态数组的属性吹为尺寸或固定数组。如果您经常访问阵列,这可能会更有效,如果您从DICTionary读取I类型,则更方便。 READV只读取一个数组属性。旨在明确并根据需要进行优化。

以下是UniVerse中4个生成相同输出的行的示例:

dim dimarr1(9), dimarr2(9)                                      
open 'VOC' else abort                                           
matread dimarr1 from 'OLDSTYLE' then print dimarr1(1) else abort
read dynarr from 'OLDSTYLE' then print dynarr<1> else abort     
matparse dimarr2 from dynarr ; print dimarr2(1)                 
readv dynatt from 'OLDSTYLE', 1 then print dynatt else abort    
end