小编Col*_*ers的帖子

与R中的类似方法相比,Matlab中的textscan使用了过多的RAM

我在Linux Mint v12上运行Matlab R2011b和R版本2.13.1,内存为16 GB.

我有一个csv文件.前5行(和标题)是:

#RIC,Date[G],Time[G],GMT Offset,Type,Price,Volume
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.68,1008
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.68,1008
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.66,300
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.65,1000
DAEG.OQ,07-JUL-2011,15:10:03.464,-4,Trade,1.65,3180
Run Code Online (Sandbox Code Playgroud)

文件很大(约900MB).鉴于字符和数字数据的组合,可以将此文件读入matlab,如下所示:

fid1 = fopen('/home/MyUserName/Temp/X.csv');
D = textscan(fid1, '%s%s%s%f%s%f%f', 'Delimiter', ',', 'HeaderLines', 1);
fclose(fid1);
Run Code Online (Sandbox Code Playgroud)

虽然文件是900MB,但在运行上面的代码时,系统监视器表明我的RAM使用率从大约2GB跳到10GB.更糟糕的是,如果我尝试使用稍微大一点的csv文件(大约1.2 GB)进行相同的操作,我的RAM最大值为16GB,而Matlab从未设法读完数据(它只是停留在"忙碌"模式).

如果我想将相同的文件读入R,我可能会使用:

D <- read.csv("/home/MyUserName/Temp/X.csv", stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

这比Matlab要长一些,但系统监视器表明我的RAM使用率仅从2GB跳到3.3GB(考虑到原始文件大小,更合理).

我的问题有两个部分:

1)为什么textscan在这种情况下会出现这样的记忆?

2)我是否可以使用另一种方法在我的系统上将这种类型的1.2GB csv文件放入Matlab而不会超出RAM?

编辑:只是为了澄清,我很好奇是否存在一个仅限matlab的解决方案,即我对使用不同语言将csv文件分解为更小块的解决方案不感兴趣(因为这是什么我已经在做了).对不起Trav1s,我应该从一开始就明白这一点.

memory csv matlab textscan

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

显示自定义色彩图中矩阵的值(Matlab)

我想基于其包含的值来可视化矩阵.我有一个单元格,其中包含11个矩阵,每个矩阵有4列,分别是x,y,z(坐标)及其值.我想用位置x,y,z可视化这个值,并根据这些值定义我自己的色彩图,然后显示色条.我想用jet作为colormap.我想使用Blue来描述最大值,使用Red作为colormap上的最小值.最大值和最小值之间的值具有红色到蓝色之间的颜色.

这是我已经尝试过的代码:

figure;
hold on
for i=1:length(diameter_lca)
    L2 = diameter_lca{i};
    dl1 = find(L2(:,4) > minimal_lca & L2(:,4)<2);%diameter 0-2
    dl2 = find(L2(:,4) >= 2 & L2(:,4) <= maksimal_lca);%diameter>2-maksimal
    x=L2(:,1);
    y=L2(:,2);
    z=L2(:,3);
    plot3(y(dl1),x(dl1),z(dl1),'*','Color','r');
    plot3(y(dl2),x(dl2),z(dl2),'*','Color','b');
end
daspect([0.488281 0.488281 0.625000]);
view(3); axis tight
camlight
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我所做的是从每个矩阵可视化第4列的值,然后我做了一个条件,如果值在0-2之间,我给了红色,当它在2 - 最大值之间时第四栏,我给了蓝色.

现在,我需要显示colormap jet中每个矩阵的第4列中的每个值,没有任何条件.

matlab customization colors map colorbar

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

获取Julia(Linux)中的当前用户名

我必须做一些愚蠢的事,但我似乎无法使用Julia检索当前的用户名.最接近的函数Base似乎是gethostname(),但它返回计算机名称,而不是用户名.我尝试过系统调用但由于插值字符而遇到麻烦$.具体来说,尽管echo $USER在终端中返回相应的用户名,但当我在Julia中尝试以下内容时,我会收到各种错误或错误答案:

run(`echo $USER`)
run(`echo "$USER"`)
run(`echo '$USER'`)
run(`echo '$'USER`)
run(`echo \$USER`)
Run Code Online (Sandbox Code Playgroud)

我想这个问题是Julia误解$为插值,但我不知道如何解决这个问题.

有任何想法吗?

linux julia

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

如何检测Julia中的类型不稳定函数

设置:假设我有一个相当详细的软件(在Julia中),涉及几个模块的交互.我觉得它运行速度比应该慢.通常,要检查第一个罪魁祸首是类型不稳定的函数,即编译器无法提前确定输出类型是什么的函数.

问题:如何检测这些类型不稳定的功能?

我目前所做的:我使用分析工具,例如@tholy的ProfileView.jl包来检测瓶颈,假设类型不稳定的函数将在这里显示(由于它们的运行时间过长).但是真正好的是某种调试工具,在运行例程之后,会吐出一个函数列表,其中编译器无法提前确定输出类型.这可能吗?

julia

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

使用Julia检查变量的大小(以字节为单位)

问题:如何使用Julia 检查变量的大小(以字节单位)

我试过的:在Matlab中,whos()函数提供了这个信息,但在Julia中只提供了变量名和模块.在Julia手册中浏览标准库sizeof()看起来很有希望,但它似乎只提供规范二进制表示的大小,而不是当前变量.

julia

6
推荐指数
3
解决办法
2923
查看次数

如何从 Julia 中打开的 IOStream 中检索文件路径

我打开一些文件:

myfilepath = "/home/colin/somefile.csv"
fid = open(myfilepath, "r")
Run Code Online (Sandbox Code Playgroud)

我想从fid. 我可以用:

fid.name
Run Code Online (Sandbox Code Playgroud)

这将返回如下内容:

"<file /home/colin/somefile.csv>
Run Code Online (Sandbox Code Playgroud)

然而,据我所知,这并没有记录在案,所以我不能保证这个解决方案是面向未来的。

所以,我的问题是,是否有一种安全的方法可以IOStreamIOStream自身检索打开的文件路径?

io file julia

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

如何生成一个矩阵,其中随机整数元素介于-3和3之间,但在MATLAB中不是0

为了生成随机矩阵,我使用了以下内容:

x =兰迪([ - 3,3],4)

但是我不希望输出矩阵中有任何零.我怎样才能做到这一点?

random matlab integer matrix

5
推荐指数
2
解决办法
322
查看次数

在Julia中为多种类型的输入定义一个函数

设置:我在Julia中有一个函数,它有两个输入,xy.两个输入都是相同类型的数组,其中该类型可以是任何数字类型,Date,DateTime或String.注意,无论输入数组的上述任何元素类型如何,函数的内容都是相同的,所以我不想多次编写该函数.目前,我有这样定义的功能:

function MyFunc{T<:Number}(x::Array{T, 1}, y::Array{T, 1})
Run Code Online (Sandbox Code Playgroud)

显然,这会处理数字大小写,但不会处理Date,DateTime或String.

问题:在Julia编写函数的第一行以适应其他类型时,最佳做法是什么?注意,性能很重要.

我的尝试:我可以尝试类似的东西:

function MyFunc{T<:Number}(x::Union(Array{T, 1}, Array{Date, 1}, Array{DateTime, 1}, Array{String, 1}) y::Union(Array{T, 1}, Array{Date, 1}, Array{DateTime, 1}, Array{String, 1}))
Run Code Online (Sandbox Code Playgroud)

但这感觉很笨拙(或者可能不是?).

链接:我想这与我在Julia上的另一个Stack Overflow问题密切相关,可以在这里找到.

types julia

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

Julia有一个严格的子类型运算符吗?

问题: Julia是否有严格的子类型运算符?

注意:操作员<:不是一个严格的亚型运营商,因为Number <: Number计算结果为true.我感兴趣的运营商,将评估为falseNumber <: Number,但trueInt <: Number.

可能的用例:考虑定义的函数:

MyFunc{T<:Union(Int, String)}(x::Array{T, 1}, y::Array{T, 1)})
Run Code Online (Sandbox Code Playgroud)

目前,函数约束着xy为相同的类型,其中该类型是阵列Int,StringUnion(Int, String).但是使用严格的子类型运算符,我可以强制输入数组为类型IntString,并消除(相当奇怪的)Union(Int, String)场景.

types julia

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

如何在错误消息中显示类型别名而不是参数类型

我在julia中建立了一个参数类型:

type MyType{T}
    x::T
end
Run Code Online (Sandbox Code Playgroud)

为了简单起见,我为以下对象构建类型别名Float64

typealias MT MyType{Float64}
Run Code Online (Sandbox Code Playgroud)

我现在故意造成涉及的错误MT。例如:

y1 = MyType(1.0)
y2 = MyType(2.0)
y1 + y2
Run Code Online (Sandbox Code Playgroud)

会引发错误,因为+未为定义MyType。错误消息显示:

`+` has no method matching +(::MyType{Float64}, ::MyType{Float64})
Run Code Online (Sandbox Code Playgroud)

我想说:

`+` has no method matching +(::MT, ::MT)
Run Code Online (Sandbox Code Playgroud)

为什么?因为现实世界中的示例有时会比这个玩具示例复杂得多,并且类型别名的一个目的是使参数类型的复杂特定实例易于识别。因此,也很容易使它在错误消息中易于识别。

我尝试了什么?我最好的猜测是,错误函数string通过a 调用该函数DataType,以便在错误消息中生成适当的字符串。因此,对于我来说,可以string通过多次分派扩展功能以专门研究类型别名不是很明显,因此我对从何处去很困惑。

julia

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

标签 统计

julia ×7

matlab ×3

types ×2

colorbar ×1

colors ×1

csv ×1

customization ×1

file ×1

integer ×1

io ×1

linux ×1

map ×1

matrix ×1

memory ×1

random ×1

textscan ×1