我目前正在使用GDAL的Python绑定来处理相当大的栅格数据集(> 4 GB).因为一次将它们加载到内存中对我来说是不可行的解决方案我将它们读成更小的块并逐个进行计算.为了避免每个块读取的新分配,我使用buf_obj参数(此处)将值读取到预分配的NumPy数组中.有一点,我必须计算整个栅格的平均值和标准差.我自然而然地用于np.std计算.然而,通过分析我的程序的内存消耗,我意识到每次调用np.std额外的内存都会被分配和释放.
演示此行为的最小工作示例:
In [1] import numpy as np
In [2] a = np.random.rand(20e6) # Approx. 150 MiB of memory
In [3] %memit np.mean(a)
peak memory: 187.30 MiB, increment: 0.48 MiB
In [4] %memit np.std(a)
peak memory: 340.24 MiB, increment: 152.91 MiB
Run Code Online (Sandbox Code Playgroud)
在GitHub上的NumPy源代码树中进行的搜索显示该np.std函数在内部调用_var函数_methods.py(此处).在某一点上_var计算与平均值的偏差并将它们相加.因此,创建了输入数组的临时副本.该函数基本上计算标准偏差,如下所示:
mu = sum(arr) / len(arr)
tmp = arr - mu
tmp = tmp * tmp
sd = np.sum(tmp) …Run Code Online (Sandbox Code Playgroud) 我已经安装了德语版的Visual Studio 2010 Professional(根据Microsoft DreamSpark获得).当我尝试安装Visual Studio 2010 Service Pack 1时,我从安装程序收到以下消息:
Microsoft Visual Studio 2010 Service Pack 1 kann nicht installiert werden,da es vom aktuellen Zustand dieses Computersnichtunterstütztwird.Anweisungen zum Beheben des Problems finden Sie in der Infodatei auf der Microsoft Download Center-Website.
英文翻译是:
无法安装SP1,因为不支持计算机的实际状态.
有没有人有类似的问题和解决方案?我的操作系统是Windows 7 64位(德语版).
我awk用于格式化输出文件中的输入文件.我有几种模式来填充变量(例如示例中的"某些模式").这些变量以END块中所需的格式打印.输出必须在那里完成,因为输入文件中的外观顺序不能保证,但输出文件中的顺序必须始终相同.
BEGIN {
FS = "=|,"
}
/some pattern/ {
if ($1 == 8) {
var = $1
} else {
# Incorrect field value
exit 1
}
}
END {
# Output the variables
print var
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是exit模式中的陈述.如果存在某些错误并且调用了此命令,则根本不应该输出或者最多没有错误消息.但正如gawk手册(这里)所说,如果exit在模式块中调用该命令,则END至少会执行该块.有没有办法赶上exit这样的:
if (!exit_invoked) {
print var
}
Run Code Online (Sandbox Code Playgroud)
或其他一些方法来避免在END块中打印输出?
斯特凡
编辑:使用shellter的解决方案.
是否建议使用C++/CLI作为新的.Net应用程序的主要语言?应用程序将不使用本机代码(纯CLI).这个问题的原因是,我想使用框架而不是倾向于使用像C#或VB这样的新语言.
斯特凡