我对Julia的内存分配感到有些困惑.我从FAQ中知道清除大变量使用的内存是通过将其设置为小(如0)然后运行来完成的gc().
但是,我对以下内容感到有些困惑.我创建一个随机Float32数组:
@time A = rand(Float32, 10000, 10000);
Run Code Online (Sandbox Code Playgroud)
time表示分配了大约400MB的RAM,而Julia的RAM使用量增加了400MB.这是有道理的.
然后我应用fft,但不要将结果绑定到任何变量:
@time fft(A);
Run Code Online (Sandbox Code Playgroud)
time 表示分配了~800MB的RAM,Julia的RAM使用量增加了800MB.
但是,RAM使用率仍然比开始时高1.2GB.这让我感到困惑,因为我没有将任何变量等同于fft(A),所以我希望分配的800MB会在fft执行后立即释放.
我试着跑gc,以为朱莉娅会意识到还有800MB的RAM被用于什么:
gc();
Run Code Online (Sandbox Code Playgroud)
这什么都不做.RAM使用率保持在~1.3GB.
但是,以下两行,
A = 0;
gc();
Run Code Online (Sandbox Code Playgroud)
释放所有正在使用的1.2GB,尽管事实上sizeof(A)只有400MB.所以我的问题是:
sizeof)实际上分配了1.2GB?关于如何避免HttpClient从同步代码调用的异步代码(例如,方法)中的死锁,有很多问题,如下所示.我知道避免这些死锁的各种方法.
相反,我想了解在测试期间加剧或触发错误代码中的这些死锁的策略.
这是最近给我们带来问题的坏代码示例:
public static string DeadlockingGet(Uri uri)
{
using (var http = new HttpClient())
{
var response = http.GetAsync(uri).Result;
response.EnsureSuccessStatusCode();
return response.Content.ReadAsStringAsync().Result;
}
}
Run Code Online (Sandbox Code Playgroud)
它是从一个ASP.NET应用程序调用的,因此具有非null值SynchronizationContext.Current,它为潜在的僵局火灾提供了燃料.
除了公然滥用HttpClient之外,这个代码在我们公司的一个服务器中陷入僵局......但只是零星地.
我在QA工作,所以我尝试通过一个单元测试重新编写死锁,该单元测试命中Fiddler的侦听器端口的本地实例:
public class DeadlockTest
{
[Test]
[TestCase("http://localhost:8888")]
public void GetTests(string uri)
{
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
var context = SynchronizationContext.Current;
var thread = Thread.CurrentThread.ManagedThreadId;
var result = DeadlockingGet(new Uri(uri));
var thread2 = Thread.CurrentThread.ManagedThreadId;
}
}
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:
默认情况下,单元测试具有null SynchronizationContext.Current, …
我是Julia的新手,主要在Mathematica工作,所以我可能会有一些基本的错误.我试图计算Julia计算随机矩阵的特征系统的时间,并发现它比Mathematica慢5-6倍.
在朱莉娅:
D=1000*(rand(1000,1000)-0.5);
@time (E,F)=eig(D);
Out: elapsed time: 7.47950706 seconds (79638920 bytes allocated*)
Run Code Online (Sandbox Code Playgroud)
在Mathematica中:
First@Timing@Eigensystem[RandomReal[{-500, 500}, {1000, 1000}]]
Out: 1.310408
Run Code Online (Sandbox Code Playgroud)
对于2000 x 2000阵列来说它是相似的,虽然Julia结果的速度比Mathematica调用的速度略慢,但它仍然较慢; Julia需要22秒,而Mathematica会在8秒内计算出来.
至于我在线性代数的Julia标准库中读到的,通过调用LAPACK来实现分解,我认为这应该是非常好的,所以我很困惑为什么Julia代码运行得那么慢.有谁知道为什么会这样?它是在进行Mathematica不做的某种平衡或阵列对称检测吗?还是它实际上更慢?
此外,这是一个语法问题,可能是一个愚蠢的错误,但你如何改变朱莉娅的平衡?我试过了
@time (E,F)=eig(D[, balance=:nobalance]);
Run Code Online (Sandbox Code Playgroud)
完全像从Julia手册中复制和粘贴一样,但它只是给出了语法错误,所以出了点问题.
我正在使用Windows 7 64位,Julia版本0.2.0 64位,使用Steven Johnson网站上的说明安装,首先安装Anaconda以处理先决条件.我使用的是Mathematica学生版9.0.1.
编辑1:
执行versioninfo()屈服
Julia Version 0.2.0
Commit 05c6461 (2013-11-16 23:44 UTC)
Platform Info:
System: Windows (x86_64-w64-mingw32)
WORD_SIZE: 64
BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY)
LAPACK: libopenblas
LIBM: libopenlibm
Run Code Online (Sandbox Code Playgroud)
所以看起来我正在使用openBLAS用于LAPACK和BLAS.一旦我获得了Mathematica实现信息,我也会添加它.
编辑2:
似乎Windows Mathematica 可能使用英特尔MKL BLAS.
我还有一个关于Julia垃圾收集的问题.这是一个最小的例子:
function OscarTheGrouch()
A = rand(Float32, 20000, 20000);
A = 0;
gc();
end
Run Code Online (Sandbox Code Playgroud)
调用OscarTheGrouch()会导致RAM使用量增加1.6GB.gc()之后调用会导致它下降1.6GB.
相反,只需在全局范围内执行函数内部的代码,即执行
A = rand(Float32, 20000, 20000);
A = 0;
gc();
Run Code Online (Sandbox Code Playgroud)
在执行之前和之后保持RAM使用不变.
我以前的RAM使用问题仅仅是因为中间结果存储为ans.但是,调用whos()后调用OscarTheGrouch()显示没有存储中间数组结果.
我最近询问如何将Float32Uint8Images包或转换或数组转换为包中的图像.我得到了一个Float32案例的答案,但我仍然无法弄清楚如何保存Uint8阵列.
例如,让我们Uint8使用传统的Matlab方案创建一个随机数组,其中维度为(m,n,3):
array = rand(Uint8, 50, 50, 3);
img = convert(Image, array);
Run Code Online (Sandbox Code Playgroud)
使用与Float32案例相同的方法,
imwrite(img, "out.png")
Run Code Online (Sandbox Code Playgroud)
失败的消息
错误:方法'mapinfo'没有匹配mapinfo的方法(:: Type {ImageMagick},:: Image {Uint8,3,Image {Uint8,3,Array {Uint8,3}}}).
我检查了文档,它说
如果数据沿着数组的某个维度编码颜色信息(与Color.jl包中使用ColorValue数组相反),请确保在属性中指定"colordim"和"colorspace".
但是,检查img先前创建的对象会显示它已经设置colordim = 3并且colorspace = RGB已经设置,因此这不是问题所在.
然后我在文档中查找了所有实例MapInfo.在core.md中有一次出现:
scalei:在显示时控制默认对比度缩放的属性.这应该是MapInfo值,用于在显示时设置对比度.如果没有此属性,将使用0到1的范围.
但是没有关于MapInfo对象究竟是什么的信息,所以我进一步观察,并在function_reference.md中说:
以下是如何直接构造主要的具体MapInfo类型:
MapNone(T),表示唯一的缩放形式是转换为类型T.这不是很安全,因为值"环绕":例如,将258转换为Uint8会产生0x02,这看起来比255更暗0xFF的.
...
和其他一些例子.所以我试着指定scalei = MapNone(Uint8)如下:
img2 = …Run Code Online (Sandbox Code Playgroud) 我正在运行CUDA示例julia_gpu.cu书中的示例,使用Visual Studio Express 2012中的CUDA 6.0.以下是参考源代码:
#include <book.h>
#include <cpu_bitmap.h>
#define DIM 1000
struct cuComplex {
float r;
float i;
cuComplex( float a, float b ) : r(a), i(b) {}
__device__ float magnitude2( void ) {
return r * r + i * i;
}
__device__ cuComplex operator*(const cuComplex& a) {
return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i);
}
__device__ cuComplex operator+(const cuComplex& a) {
return cuComplex(r+a.r, i+a.i);
}
};
__device__ int julia( int x, int …Run Code Online (Sandbox Code Playgroud) 我想为Fiddler拦截的所有会话中的响应添加统一的延迟。使用"response-trickle-delay"是不可接受的,因为实际上不引入统一的延迟,而是延迟传递的每个1KB(其模拟低带宽,而不是高等待时间)。
我可以找到的唯一参考是在这里,它使用了以下残酷行为(请勿使用!):
static function wait(msecs)
{
var start = new Date().getTime();
var cur = start;
while(cur – start < msecs)
{
cur = new Date().getTime();
}
}
Run Code Online (Sandbox Code Playgroud)
并wait(5000);插入OnBeforeResponse。
正如预期的那样,它锁定了我的计算机并开始使CPU过热,因此我不得不退出Fiddler。
我在找东西:
看起来FiddlerScript是用JScript.NET编写的,从我那里收集到的是一个setTimeout()函数,但是我在调用它时遇到了麻烦(而且我根本不了解JavaScript或.NET)。这是我的OnBeforeResponse:
static function OnBeforeResponse(oSession: Session) {
if (m_Hide304s && oSession.responseCode == 304) {
oSession["ui-hide"] = "true";
}
setTimeout(function(){},1000);
}
Run Code Online (Sandbox Code Playgroud)
它只是setTimeout在行中给出语法错误。可以setTimeout()从FiddlerScript中使用以引入统一延迟吗?
我有一个3 M乘N浮点实数的数组,我想把它解释为图像的HSV通道.我想生成并导出图像.
根据功能文档,
Run Code Online (Sandbox Code Playgroud)colorim(A, [colorspace])从AbstractArray创建二维彩色图像,自动检测第一个或最后一个维度中的哪个维度对颜色进行编码,并相应地在"水平 - "和"垂直 - 主要"之间进行选择.colorspace默认为"RGB",但也可以是例如"Lab"或"HSV".
我首先测试了RGB情况:
using Images
imwrite(colorim(rand(Float64, 200, 200, 3), "RGB"), "Image.PNG")
Run Code Online (Sandbox Code Playgroud)
产生以下内容:

但是,当我根据文档将"RGB"替换为"HSV"时,我收到一条错误消息.
将数组解释并导出为HSV数据的正确语法是什么?
我一直在使用 LodePNGlodepng_encode24_file对一些 24 位 RGB 图像文件进行编码,到目前为止它工作得非常好。但是,我注意到当我向它提供大于 15360*15360 像素大小的数据集时它似乎崩溃了(14336*14336 像素图像编码良好)。
对于 32 位情况(崩溃前的最大大小略低),可以通过简单地替换该行来获得此行为的最小示例
unsigned width = 512, height = 512;
Run Code Online (Sandbox Code Playgroud)
和
unsigned width = 1024*14, height = 1024*14;
Run Code Online (Sandbox Code Playgroud)
在LodePNG 的 example_encode.c 文件中,并执行它。
我之前遇到过 C 代码崩溃的问题,因为我将大数组分配到堆栈内存(其最大大小通常在 2MB 左右)而不是堆内存,所以作为 C 的新用户,我的第一直觉是看看是否有堆内存大小的上限。
但是,根据这个答案,堆内存没有限制,所以一定是其他地方出了问题。
我的第二个猜测是崩溃是由于 PNG 格式本身支持的最大图像尺寸的固有限制。但是,根据此答案及其下方的评论,PNG 支持的最大文件大小约为 4,000,000,000 * 4,000,000,000 像素,因此这也不是罪魁祸首。
有没有人猜测可能会出什么问题?其他人在尝试时是否能够重现此错误?
编辑:就 RAM 消耗而言,我有 8GB RAM,减去硬件保留的、使用中的、修改过的和备用内存(Windows 资源监视器实用程序使用的术语),在进行计算时,我有大约 4GB 的可用 RAM。对于 15000*15000 大小的 32 位图像,需要小于 1GB。同样,当我成功编码 14000*14000 24 位图像时,我的可用 RAM 在编码过程的任何时候都不会低于 3GB,所以我认为 RAM 耗尽不是问题。
FiddlerScript 能够进行JSON解析和修改。例如,以下添加项OnBeforeResponse将用以下方式轻松替换Ipify返回的外部IP地址127.0.0.1:
if (oSession.url == "api.ipify.org/?format=json"){
var j = GetResponseJson(oSession);
j["ip"] = "127.0.0.1";
SetResponseJson(oSession, j);
}
Run Code Online (Sandbox Code Playgroud)
我从Eric的链接答案中获得的帮助函数在哪里GetResponseJson和哪里SetResponseJson:
static function GetResponseJson(oSession: Session){
return Fiddler.WebFormats.JSON.JsonDecode(oSession.GetResponseBodyAsString()).JSONObject;
}
static function SetResponseJson(oSession: Session, j){
oSession.utilSetResponseBody(Fiddler.WebFormats.JSON.JsonEncode(j));
}
Run Code Online (Sandbox Code Playgroud)
这对于修改Fiddler截获的JSON有效负载非常有用。
我的问题是:
julia ×5
c ×2
fiddler ×2
image ×2
async-await ×1
c# ×1
cuda ×1
deadlock ×1
javascript ×1
json ×1
performance ×1
png ×1
qa ×1
xml ×1