我需要了解 MATREAD 和 READ 之间的区别?请提供一个简单的例子,说明在哪里以及如何使用它。
2 回答
READ
将从磁盘读取记录并将其作为Dynamic Array
.
MATREAD
将从磁盘读取记录并将其作为Dimensioned Array
.
因此,真正的诀窍是确定哪种数组类型更适合您的用例。
ADynamic Array
本质上是一个字符串,它使用某些字节标记来分隔每个元素(属性/多值/子值)。它非常易于使用,不需要预先声明或调整大小。不利的一面是, if 可能比 a 慢Dimensioned Array
,主要用于大型记录或当您将从数组中随机检索属性时 - 我认为是 O(n log n)。顺序访问经过优化,接近Dimensioned Arrays
速度。
ADimensioned Array
本质上是一个字符串数组(或者Dynamic Arrays
在 UniVerse 的情况下)。它将每个属性读入一个数组位置。然后,每个数组位置将Dynamic Array
仅包含该属性的多值/子值位置。Dimensioned Arrays
要求您预先声明它们和数组位置的数量。根据您运行的风格,如果您尝试读取具有比数组大小更多的属性的记录,它可能会导致运行时错误。另一方面,无论您的访问模式如何,从数组中检索属性都是 O(1)。
MATREADU 将 MATPARSE 与 READ 捆绑在一起。这些将动态数组的属性吹入一个维度或固定数组。如果您经常访问数组,这可能会更有效,如果您从 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