问题标签 [pre-allocation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
160 浏览

matlab - MATLAB 中的预分配

问题

我有一个矩阵 M 如下:

所有列中的总数为 21:

然后我预分配内存以查找 M 中每一列的行索引:

下一步是查找所有列的行索引:

问题

尽管对 row_indices 进行了预分配,MATLAB 仍然建议在循环内预分配 row_indices 以提高速度。有人可以解释为什么会这样吗?我的猜测是,由于我在循环中不断更改 row_indices 的大小,因此我预分配的先前内存被覆盖并被丢弃,这本质上意味着我所做的预分配变得无用。

0 投票
0 回答
134 浏览

pytorch - 组装需要渐变的 PyTorch `Tensor` 的有效方法

我需要构建一个 4 维 PyTorch Tensor,其中一个维度来自将恒定稀疏矩阵与密集向量相乘。密集向量和生成的 4DTensor需要跟踪梯度。由于 PyTorch 仅支持 sparse matrices,我无法将整个事情表达为Tensor-Tensor乘法,我认为我必须在循环中进行构造的矩阵乘法部分。在那种情况下,我至少想预先分配结果 4DTensor并让稀疏mm填充循环中的一维。

在这种情况下,我如何跟踪生成的 4DTensor的渐变要求?创建后可以手动将其附加到渐变图中吗?

我目前的方法效率极低,基本上可以在列表中一次构建一个维度cat

0 投票
5 回答
539 浏览

matlab - 在 matlab 中声明一个我们不知道其大小的向量

假设我们在 MATLAB 中运行一个无限循环,并且我们希望将迭代值存储在一个向量中。我们如何在不知道向量大小的情况下声明向量?

0 投票
1 回答
89 浏览

arrays - 你可以预先分配一个随机大小的数组吗?

有问题的代码的基本部分可以提炼成:

这个程序运行得很慢,我怀疑这就是原因,但我不知道如何修复它。的长度hitlist必然会以随机方式变化,所以我不能简单地预先分配适当大小的“零”。我打算将hitlistazeros作为我列表的长度,但是我必须删除所有多余的零,而且我不知道如何在没有同样问题的情况下做到这一点。

如何预分配随机大小的数组?

0 投票
1 回答
659 浏览

windows - Windows (ReFS​​,NTFS) 文件预分配提示

假设我有多个进程写入大文件(20gb+)。每个进程都在写入自己的文件,并假设该进程一次写入 x mb,然后进行一些处理并再次写入 x mb,等等。

发生的情况是这种写入模式导致文件严重碎片化,因为文件块在磁盘上连续分配。

当然,通过SetEndOfFile在打开文件时使用“预分配”文件,然后在关闭文件之前设置正确的大小,很容易解决这个问题。但是现在远程访问这些文件的应用程序能够解析这些正在进行的文件,显然会在文件末尾看到零,并且解析文件需要更长的时间。我无法控制这个阅读应用程序,所以我无法优化它以在最后考虑零。

另一个肮脏的解决方法是更频繁地运行碎片整理,运行 Systernal 的 contig 实用程序,甚至实现一个自定义的“碎片整理程序”,它将处理我的文件并将它们的块合并在一起。

另一个更激进的解决方案是实现一个微型过滤器驱动程序,它会报告一个“假”文件大小。

但显然上面列出的两种解决方案都远非最佳。所以我想知道是否有办法向文件系统提供文件大小提示,以便它“保留”驱动器上的连续空间,但仍向应用程序报告正确的文件大小?

否则显然一次写入更大的块显然有助于碎片化,但仍然不能解决问题。

编辑:

由于SetEndOfFile在我的情况下的有用性似乎存在争议,我做了一个小测试:

当应用程序执行并在 SetEndOfFile 之后等待按键时,我检查了磁盘上的 NTFS 结构: 前

该图像显示 NTFS 确实为我的文件分配了集群。但是,未命名的 DATA 属性已StreamDataSize指定为 0。

Systernals DiskView 还确认集群已分配 迪克视图

当按下回车键以允许测试继续时(并等待相当长的时间,因为文件是在慢速 USB 记忆棒上创建的),该StreamDataSize字段已更新 在此处输入图像描述

由于我最后写了 1 个字节,NTFS 现在真的必须将所有内容归零,所以SetEndOfFile确实有助于解决我“烦恼”的问题。

我非常感谢答案/评论也提供了官方参考来支持所提出的主张。

哦,在我的情况下,测试应用程序会输出这个:

同样为了完整起见,这里是一个示例,设置时 DATA 属性的外观FileAllocationInfo(请注意,我为此图片创建了一个新文件) 在此处输入图像描述

0 投票
2 回答
272 浏览

mongodb - 如何禁用 mongod 日志预分配

有没有办法防止 mongod 在日志文件夹中预先分配这些 100 MB 文件?

WiredTigerPreplog.0000000001 WiredTigerPreplog.0000000002

我希望启用日记功能。

0 投票
2 回答
78 浏览

r - 在自定义 R 函数中预分配内存以提高性能(使用 dplyr)

编辑:由于我对 data.table 完全不熟悉,除了切换到 data.table 之外,是否有人对其他解决方案有任何想法?万分感谢!

我有一个相当大的数据集,其中包含不同类型事件的开始日期和结束日期(每一行都包含一个具有相应开始日期和结束日期的事件)。现在我想知道在当前事件之前或之后是否有相同类型的事件。棘手的是,事件之间的假期和周末不算/不应该考虑。

示例:类型 1 的事件在星期三开始,在星期五结束,然后是周末,星期一另一个类型 1 事件开始并持续到星期五。在这种情况下,第二个事件的“incident_directly_before”为真(=1),因为这两个事件仅相隔一个周末,不应考虑,而第一个事件为假(=0),因为它是同类中的第一个。

我为此编写了一个函数,但是速度很慢。

我现在的问题是:你知道如何提高代码的性能吗?

我已阅读有关内存预分配的信息,但由于我没有任何“for(i in 1:n)”,我不知道该怎么做。

我也尝试过编译器包中的 cmpfun(),但它的性能或多或少与原来的相同(甚至稍差)。

由于我没有 CS 背景,只是为了深入研究代码优化的主题,我真的很高兴能得到一些帮助,并解释为什么某些方法(不)适用于我的情况。

套餐:

示例数据:

我的自定义假期向量示例:

我的功能是检查之前是否发生过相同类型的事件(周末和节假日除外):

该函数基本上做了以下事情:1)如果它是类型的第一个事件/滞后事件是NA,则将0分配给priorincident(=没有相同类型的先前事件)。2) else:取当前行的开始日期,看看前一天是节假日还是周六/周日;如果是,请再返回一天并再次检查(...)。如果 startdate 减去 n-days 既不是假期,也不是星期六/星期日,也不是滞后事件的结束日期,则将 0 分配给priorincident,但是,如果 startdate 减去 n-days 是先前事件的结束日期,则分配1 到优先事件(= 之前发生过相同类型的事件)。

(由于 dplyr 管道中的 group_by(type) 覆盖了“相同类型”方面)

然后我使用 dplyr 按事件类型分组,然后应用事件函数:

非常感谢你没有让我浪费我的生命盯着那个可爱的小红八角!

0 投票
1 回答
65 浏览

arrays - 为每次迭代改变大小的变量预分配内存(长文本文件)

我编写了一个将图像转换为文本文件以进行光刻的代码。图片为高分辨率(26.5kx 26.5k),文本文件超过 2MB。我的问题是代码需要很长时间才能工作,我怀疑它与内存碎片有关(我不是经验丰富的程序员,特别是刚开始使用 MATLAB)。它在两个地方滞后:在您必须选择要使用的特定图像之前,以及在处理它之后。

在处理部分,我从 MATLAB 中得到以下评论:

指示的变量或数组的大小似乎随着每次循环迭代而变化。通常,出现此消息是因为数组通过赋值或连接而增长......

但是还有这部分:

如果满足以下任一条件,则可能适合禁止显示此消息,如调整代码分析器消息指示器和消息中所述: 循环代码包含数组增长的条件块。(在这种情况下,只有在循环找到这样的条件时才增长数组是合理的。)对于循环中的每次迭代,连接的长度会有所不同(例如具有可变长度的字符向量)。在进入循环之前,数组的总大小是无法计算的。

输出文本文件很大程度上取决于提供的图像和其中的黑白像素数。

所以我想知道是否有任何方法可以提高代码的性能?

在选择图像文件之前,几乎没有任何计算,携带的也很简单,不知道为什么这么慢。

对于第一个函数,就在调用打开图像文件的第二个函数之前:

之后是regionpropsApply允许您选择图像文件并将其分割成单个图像的函数,每个图像将由第三个也是最后一个函数处理成一个文本文件,其中我有这个命令收集一个长字符串,它将进入文本文件:

其中cmdJump和是在此特定迭代中创建的命令cmdZcmdMov在迭代之前,我已经知道所需的迭代次数。每次迭代都将始终包含这 3 个命令。每个图像(从原始图像中分割出来的)都被单独处理。我应该什么时候预分配内存以及如何预分配内存?

目前,执行代码需要 40 多分钟,考虑到输出文件只有 2MB 的事实,我真的希望它不到几分钟。

0 投票
0 回答
223 浏览

matlab - MATLAB 的隐式广播是否根据周围代码进行优化?

今天提出的一个问题在隐式数组创建方面给出了令人惊讶的结果:

到目前为止,一切都很好。包含 496736*9286 双精度值的数组应该是 34GB,而包含相同数量元素的逻辑数组只需要 4.3GB(小 8 倍)。后两者会发生这种情况,因为它们使用包含所有双精度距离对的中间矩阵,需要完整的 34GB,而逻辑矩阵直接预分配为逻辑矩阵,需要 4.3GB。

令人惊讶的部分来了:

什么?!?由于创建了中间双矩阵,为什么隐式扩展不需要相同的 34GB RAM output = abs(array1.' - array2)

这特别奇怪,因为据我了解,隐式扩展是编写旧bsxfun解决方案的一种简短方法。因此,为什么会bsxfun创建完整的 34GB 矩阵,而隐式扩展却没有呢?

MATLAB 是否以某种方式识别运算的输出应该是逻辑矩阵?


在 MATLAB R2018b、Ubuntu 18.04、16GB RAM 上执行的所有测试(即 34GB 阵列出错)

0 投票
1 回答
30 浏览

arrays - MATLAB - S&P 每日收益矩阵:在 for 循环内替换零矩阵

晚上好,

我必须根据标准普尔指数的 174 个每日价格创建一个每日回报矩阵。我从中获取此类价格的表称为“价格”,而我必须将这些值插入的目标矩阵称为“库存退货”。我已经尝试在预分配一个 173*500 数组后设置一个嵌套的 for - 循环零(否则该过程需要 1 个多小时),但我得到的输出是一个零矩阵。

谁能帮帮我?这是我正在使用的代码: