2016-04-25 95 views
1

我有一个大对象,我想存储在一个ArrayBuffer(让我们说Uint8Array)。注意:我不知道对象有多大。JS:ArrayBuffer的未知大小

我已经有了关于在缓冲区中设置值的所有逻辑。 (例如,如果我使用new Uint8Array(100000000);,它已经在工作。)

问题是我不知道是否可以有效调整缓冲区的大小。性能是这里的主要关注点。

我一直在考虑从说new Uint8Array(100);开始,如果我需要更多,我创建一个新的大小为new Uint8Array(200);的两倍,并复制新的现有内容(不太确定如何)。等等。

刚刚创建一个常规数组并将其转换为Uint8Array

+0

你一次需要多少个这样的数组? – deamentiaemundi

+0

只有1.我每秒都会创造很多,但一次只能创造1个。 – RainingChain

回答

0

如果您一次只需要一个,但每次仍然很多,并且需要速度,则需要保留第一个数组并覆盖它。你可以根据你的描述计算出第一个所需的内存量(它不是那么慢),但是保留下一个的数组(你需要一些东西来保持当前的长度)。每次你需要更多的时候,你都会像第一次那样做。当它变得太大时,你可能会不时“释放”内存。

这是一个穷人的malloc() /垃圾回收器,是的,它假定你需要的数组是严格连续。

+0

但是这意味着小数据将使用大数组大小。我将数据发送给客户端,因此需要保持较小的数据。 – RainingChain

+0

对不起,但你不能两者兼得(至少不是现在*,这种特殊阵列的'realloc()'计划在不久的将来)。你要么快速**或**小。它不是严格的二元的,所以你可以用旋钮玩一下,但是你也不能吃蛋糕并保留它。还有:你确定*,那就是你运行了一个合适的性能分析会话,以确保数组处理是迄今为止(!)最大的瓶颈?哦,如果你通过网络发送它:带宽比cpu-time要贵得多,所以你的方法'Array'到'UInt8Array'可能是最适合你的。 – deamentiaemundi