相关疑难解决方法(0)

ArrayList:大小如何增加?

我有一个关于Java的基本问题ArrayList.

ArrayList被声明和初始化使用默认构造,对于10个元件的存储器空间被创建.现在,当我添加第11个元素时,会发生什么?是否会创建具有20(或更多)元素容量的新内存空间(这需要将元素从第一个内存位置复制到新位置)还是其他一些东西?

我查了这里.但我没有找到答案.

请分享知识.谢谢.

java arrays collections arraylist

64
推荐指数
8
解决办法
11万
查看次数

在Matlab中截断大数组的内存有效方法

我在Matlab中有一个大型(多GB)数组,我想截断¹.天真地,我认为截断不需要太多内存,但后来我意识到它可能会:

>> Z = zeros(628000000, 1, 'single');
>> Z(364000000:end) = [];
Out of memory. Type HELP MEMORY for your options.
Run Code Online (Sandbox Code Playgroud)

除非Matlab在截断之前做了一些聪明的优化,否则Z这段代码实际上会创建一个数组(类型为double!)364000000:628000000.我不需要这个数组,所以我可以这样做:

>> Z = Z(1:363999999);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,第二个例子有效,并且对我来说没问题.但为什么它有效呢?如果Z(364000000:end) = 0由于没有所需的中间阵列的存储器364000000:628000000,那么,为什么不Z = Z(1:363999999)因未能所需中间阵列的存储器1:363999999,这是较大的?当然,我不需要这个中间数组,并且对于在没有任何中间数组的情况下截断我的数组的解决方案感到满意,或者,如果Matlab优化了特定方法,则会失败.

  • 有没有办法在不创建中间索引数组的情况下截断数组?
  • 如果不是,前面提到的方法中的任何一种方法比另一种方法更具记忆效率(看来是不是)?如果是这样,为什么?Matlab是否真的在两个例子中都创建了中间数组?

¹原因:我正在处理数据,但不知道预分配多少.我做了一个有根据的猜测,经常我分配太多.我根据可用内存选择块大小,因为拆分更少的块意味着更快的代码.所以我想避免任何不必要的内存使用.另见关于按块分配的这篇文章.

memory arrays matlab truncate

15
推荐指数
1
解决办法
3039
查看次数

变量似乎在每次循环迭代时改变大小 - 什么?

在编写以下Matlab代码时:

for ii=1:n
    x(ii) = foo( ii ); % foo is some function of ii that cannot be vectorized.
end
Run Code Online (Sandbox Code Playgroud)

我得到以下m-lint警告:

变量x似乎在每次循环迭代时改变大小

我的问题:

  1. 这个警告意味着什么?
  2. 为什么每次迭代都会改变变量大小是件坏事?
  3. 怎样才能解决这个问题?

这个问题是不能重复的这一个,因为它与预分配的更一般的问题,而是它的一个特定实例涉及.

iteration matlab memory-management

9
推荐指数
3
解决办法
2万
查看次数