【问题标题】:Editing Values in Typed Arrays编辑类型化数组中的值
【发布时间】:2013-10-24 00:20:57
【问题描述】:

使用 JavaScript 我想偏移类型化数组中的元素,这样如果原始数组的值介于 0 到 99 之间,新数组将从 10 开始到 99,留下 10 个空元素用于新数据。 所以如果原始数组可以看成一个 10 x 10 的网格,我想将所有数据上移一行,然后在最下面一行输入新数据。

我知道这可以使用循环来完成,但是对于我的具有更大数组 (990 x 1920) 的项目来说,这种方法太慢了。 我已经尝试了 ArrayBuffers,但没有成功。

以下测试方法(使用子数组)的问题在于,虽然 data1 的大小指定为 100,但在应用时似乎会减小到子数组的大小。然后我找不到在最后添加更多数据的方法。

function initialize() {

    data = new Uint32Array(100);
    data1 = new Uint32Array(100);

    for (var i = 0; i < data.length; i++) {
    data[i] = i;
    }
    data1 = data.subarray(10);

    console.log(data1);
}

除了循环之外,还有什么方法可以偏移类型数组中的数据并在末尾添加数据。

好的,我使用 Set() 在 Typed Arrays in Gecko 2: Float32Array concatenation and expansion 找到了解决方案。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    在 JavaScript 中,类型化数组是一种基于 ArrayBuffer 的固定长度数据结构,即无论如何都是预先分配的一块内存。因此,类型化数组没有像 push、pop 等变长方法。 所以为了抵消一个类型化的数组,你只有两个选择。

    • 提前预分配大量内存并移位“类型化数组”,这实际上是一个内存块的视图

      var SIZE=100;
      var SHIFT=10;
      var buffer = new ArrayBuffer(100000); // preallocate a lot of memory
      var data = new Uint32Array(buffer, 0, SIZE);
      for (var i = 0; i < SIZE; i++) {
          data[i] = i;
      }
      var data1 = new Uint32Array(buffer, Uint32Array.BYTES_PER_ELEMENT*SHIFT, SIZE)
      data1[90]=100; //set the 101st (91st) element
      console.log('data1', data1);//10,11,...98,99,100,0,0,0,0,0,0,0,0,0
      
    • 将旧数据的切片复制到新的内存区域中。

      var SIZE=100;
      var SHIFT=10;
      var data = new Uint32Array(SIZE);
      for (var i = 0; i < SIZE; i++) {
          data[i] = i;
      }
      var data1 = new Uint32Array(SIZE)
      data1.set(data.subarray(SHIFT));
      data1[90]=100; //set the 101st (91st) element
      console.log('data1', data1); //10,11,...98,99,100,0,0,0,0,0,0,0,0,0
      

    这是经典的space-time tradeoff。 第一个选项占用更多内存但 CPU 周期更少,第二个选项则相反。

    【讨论】:

    • 感谢您提供的信息。我使用的解决方案类似于您的第二个建议。我会检查你的第一个建议,看看内存是否可以处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多