【问题标题】:what's the difference between MATREAD and READ?MATREAD 和 READ 有什么区别?
【发布时间】:2013-05-13 11:38:49
【问题描述】:

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

【问题讨论】:

    标签: u2 universe


    【解决方案1】:

    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)。

    【讨论】:

    • 丹 - 很好的解释。但是,我认为动态数组访问是 O(n)。进行了快速测试,结果如下:Time to access position: 50000 = 0 ms. Time to access position: 100000 = 1 ms. Time to access position: 200000 = 3 ms. Time to access position: 500000 = 8 ms. Time to access position: 1000000 = 15 ms. Time to access position: 5000000 = 76 ms. Time to access position: 10000000 = 153 ms. 最后几个示例显示了非常好的线性进展。
    • 谢谢肖恩 - 你是对的。单次访问是 O(n)。我正在考虑访问所有元素,对于维度来说是 O(n),对于动态来说是 O(n^2)。
    • 丹 - 只是想添加这是一个很好的答案。非常直接且消息灵通。
    【解决方案2】:

    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 
    

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 2010-10-09
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多