小编Dum*_*fus的帖子

在Julia中被内存分配和垃圾收集困惑

我对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.所以我的问题是:

  • 为什么它看起来好像一个400MB大小的对象(根据sizeof)实际上分配了1.2GB?

garbage-collection memory-management julia

13
推荐指数
1
解决办法
2012
查看次数

如何触发(不要避免!)HttpClient死锁

关于如何避免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应用程序调用的,因此具有非nullSynchronizationContext.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, …

c# deadlock qa async-await dotnet-httpclient

13
推荐指数
2
解决办法
1203
查看次数

Julia中的特征分解比Mathematica慢5倍?

我是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.

performance linear-algebra julia

10
推荐指数
2
解决办法
2704
查看次数

Julia:函数内部的垃圾收集与全局空间的工作方式不同

我还有一个关于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()显示没有存储中间数组结果.

  • 那么,记忆在哪里?函数内的垃圾收集是否与全局范围内的行为不同(不太积极?)?

我浏览了关于Julia函数文章,但没有看到任何明显的东西.

garbage-collection julia

7
推荐指数
1
解决办法
985
查看次数

使用Julia中的Images将Uint8数组导出为图像

最近询问如何将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)

image julia

6
推荐指数
1
解决办法
1649
查看次数

运行"CUDA By Example"时的CUDA错误julia_gpu.cu

我正在运行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)

c cuda

4
推荐指数
1
解决办法
805
查看次数

在FiddlerScript中添加延迟

我想为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中使用以引入统一延迟吗?

fiddler

4
推荐指数
1
解决办法
1442
查看次数

在Julia中通过"N"由3个数组生成一个HSV图像

我有一个3 MN浮点实数的数组,我想把它解释为图像的HSV通道.我想生成并导出图像.

根据功能文档,

colorim(A, [colorspace])
Run Code Online (Sandbox Code Playgroud)

从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数据的正确语法是什么?

image julia

2
推荐指数
1
解决办法
390
查看次数

编码大于 15000 * 15000 像素的 PNG 文件时,LodePNG 崩溃

我一直在使用 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 耗尽不是问题。

c png

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

Fiddler XML解析

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有效负载非常有用。

我的问题是:

  • 有没有一种等效的方法来解析和修改FiddlerScript中的XML

javascript xml json fiddler

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