由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教Matlab和IDL的处理数据能力差异
相关主题
c语言如何pass变量的值我这个读写文本文件的程序为什么第一次总是出错?
c++产生随机数C语言程序静态库和动态库的创建及其应用
怎样读一个不断更新的文件open an image file
ask a question about struct in C programmingPerl and Matlab Question
[合集] visual c++中读二进制图形文件的奇怪问题一个简单的算法问题?
请教一个文件IO的问题matlab中如何调用c
linux怎么读入一个超过有超过1B integer的binary file? (转载)size of structure
serialization 到底该怎么理解啊?c里从文件读数据,什么方法比较好?
相关话题的讨论汇总
话题: matlab话题: data话题: numfreqs话题: fread话题: idl
进入Programming版参与讨论
1 (共1页)
H***a
发帖数: 735
1
任务:现有一堆binary数据文件(总共大约500MB,这个只是测试,大一点的
simulation会产生10GB左右的data),格式一样,需要逐一读入,然后构建成一个4维
的矩阵;
尝试:用IDL读大概就5秒钟,用Matlab读用了5分钟以上!
疑问:常听朋友说处理大块数据方面IDL比Matlab快,但为什么会有这么大的差异?
google了一下,有人的测试结果居然是Matlab比IDL快,难以置信。想用Matlab处理主
要是因为它的GUI比较方便,是不是没有更好的办法了?
请大家给点意见。多谢!
k****f
发帖数: 3794
2
500MB的数据从硬盘读入,5秒钟肯定不够吧。

【在 H***a 的大作中提到】
: 任务:现有一堆binary数据文件(总共大约500MB,这个只是测试,大一点的
: simulation会产生10GB左右的data),格式一样,需要逐一读入,然后构建成一个4维
: 的矩阵;
: 尝试:用IDL读大概就5秒钟,用Matlab读用了5分钟以上!
: 疑问:常听朋友说处理大块数据方面IDL比Matlab快,但为什么会有这么大的差异?
: google了一下,有人的测试结果居然是Matlab比IDL快,难以置信。想用Matlab处理主
: 要是因为它的GUI比较方便,是不是没有更好的办法了?
: 请大家给点意见。多谢!

k****e
发帖数: 100
3
MATLAB自己的格式mat读写还是很快的。但你说的这个差异,倒是很诡异,太大了,5分
钟这个记录很大,难道你读一个,赋值一个?

【在 H***a 的大作中提到】
: 任务:现有一堆binary数据文件(总共大约500MB,这个只是测试,大一点的
: simulation会产生10GB左右的data),格式一样,需要逐一读入,然后构建成一个4维
: 的矩阵;
: 尝试:用IDL读大概就5秒钟,用Matlab读用了5分钟以上!
: 疑问:常听朋友说处理大块数据方面IDL比Matlab快,但为什么会有这么大的差异?
: google了一下,有人的测试结果居然是Matlab比IDL快,难以置信。想用Matlab处理主
: 要是因为它的GUI比较方便,是不是没有更好的办法了?
: 请大家给点意见。多谢!

H***a
发帖数: 735
4
5秒可能夸张了点,但我眼睛盯着差不多数到10就好了,linux服务器上读的。

【在 k****f 的大作中提到】
: 500MB的数据从硬盘读入,5秒钟肯定不够吧。
H***a
发帖数: 735
5
对一般的binary文件读写呢?是啊,我也没想到差异这么大,IDL我是盯着屏幕数到10
左右就好了的,但Matlab读了半天,让我等得心烦,不得不一边上网。
嗯,文件是一个一个读的。我最后的目的是把数据汇总成一个总的矩阵,就是说每个文
件里的数据对应于矩阵的一部分;所以每读一个文件,就把这个文件里数据安置到矩阵
里相应的位置。
我觉得IDL的优势在于可以按照用户指定的template读数据,但这个差异如此之大令我
不解。请教Matlab里面有类似的template么?

【在 k****e 的大作中提到】
: MATLAB自己的格式mat读写还是很快的。但你说的这个差异,倒是很诡异,太大了,5分
: 钟这个记录很大,难道你读一个,赋值一个?

k**f
发帖数: 372
6
My experience is that the native MATLAB code is kind of slow reading/writing
user defined binary file, especially when the raw data type do not have the
same length. E.g., a double followed by a int. You may have to read/write
the data one by one.
If you write a C-mex file to read it, you can define a data structure of one
double and one int, them read the structure instead of reading the
individual elements. It will be much faster.
t****t
发帖数: 6806
7
请问你对于每个文件的数据是怎么读的?

10

【在 H***a 的大作中提到】
: 对一般的binary文件读写呢?是啊,我也没想到差异这么大,IDL我是盯着屏幕数到10
: 左右就好了的,但Matlab读了半天,让我等得心烦,不得不一边上网。
: 嗯,文件是一个一个读的。我最后的目的是把数据汇总成一个总的矩阵,就是说每个文
: 件里的数据对应于矩阵的一部分;所以每读一个文件,就把这个文件里数据安置到矩阵
: 里相应的位置。
: 我觉得IDL的优势在于可以按照用户指定的template读数据,但这个差异如此之大令我
: 不解。请教Matlab里面有类似的template么?

r****t
发帖数: 10904
8
听说 matlab .mat 现在已经是 hdf5 了,是不是这样?

【在 k****e 的大作中提到】
: MATLAB自己的格式mat读写还是很快的。但你说的这个差异,倒是很诡异,太大了,5分
: 钟这个记录很大,难道你读一个,赋值一个?

r****t
发帖数: 10904
9
这多半是 code 正好用了 IDL 的强项,而暴露了 matlab 的弱项。write it in
matlab's way, 应该最后都差不多。

【在 H***a 的大作中提到】
: 任务:现有一堆binary数据文件(总共大约500MB,这个只是测试,大一点的
: simulation会产生10GB左右的data),格式一样,需要逐一读入,然后构建成一个4维
: 的矩阵;
: 尝试:用IDL读大概就5秒钟,用Matlab读用了5分钟以上!
: 疑问:常听朋友说处理大块数据方面IDL比Matlab快,但为什么会有这么大的差异?
: google了一下,有人的测试结果居然是Matlab比IDL快,难以置信。想用Matlab处理主
: 要是因为它的GUI比较方便,是不是没有更好的办法了?
: 请大家给点意见。多谢!

C*********g
发帖数: 3728
10
这个......IDL和matlab对于数据类型的定义是不太一样的。如果matlab读了5分钟,几
乎可以肯定你设置的数据类型导致占用的内存超过了物理内存,所以一下子慢了。

【在 H***a 的大作中提到】
: 任务:现有一堆binary数据文件(总共大约500MB,这个只是测试,大一点的
: simulation会产生10GB左右的data),格式一样,需要逐一读入,然后构建成一个4维
: 的矩阵;
: 尝试:用IDL读大概就5秒钟,用Matlab读用了5分钟以上!
: 疑问:常听朋友说处理大块数据方面IDL比Matlab快,但为什么会有这么大的差异?
: google了一下,有人的测试结果居然是Matlab比IDL快,难以置信。想用Matlab处理主
: 要是因为它的GUI比较方便,是不是没有更好的办法了?
: 请大家给点意见。多谢!

相关主题
请教一个文件IO的问题我这个读写文本文件的程序为什么第一次总是出错?
linux怎么读入一个超过有超过1B integer的binary file? (转载)C语言程序静态库和动态库的创建及其应用
serialization 到底该怎么理解啊?open an image file
进入Programming版参与讨论
H***a
发帖数: 735
11
我用下面这段code读的,请指教,谢谢!
for procID=0:(numProcs-1)
fileName = sprintf('%d-DATA.dat', procID);
data = fopen(fileName, 'r');

if data ~= -1
numFreqs = fread(data, 1, 'long');
numLocations = fread(data, 1, 'long');

for m=1:numLocations
x = fread(data, 1, 'long') + 1;
y = fread(data, 1, 'long') + 1;
z = fread(data, 1, 'long') + 1;
for w=1:numFreqs
re = fread(data, 1, 'double');


【在 t****t 的大作中提到】
: 请问你对于每个文件的数据是怎么读的?
:
: 10

H***a
发帖数: 735
12
怎么样叫matlab's way?能否展开说说?谢谢。

【在 r****t 的大作中提到】
: 这多半是 code 正好用了 IDL 的强项,而暴露了 matlab 的弱项。write it in
: matlab's way, 应该最后都差不多。

H***a
发帖数: 735
13
Thx for the suggestion. Yes my data are in a structure exactly like you
described, some integers, followed by some complex numbers, and some
integers, some complex numbers, and so on. I found Matlab did not
perform well in reading this way.
I had no idea about C-mex before you talking about it. To me understanding,
C-Mex files are applied to dynamically link subroutines in C source code so
in Matlab it can utilize those subroutines as builit-in functions after
compling them, righ

【在 k**f 的大作中提到】
: My experience is that the native MATLAB code is kind of slow reading/writing
: user defined binary file, especially when the raw data type do not have the
: same length. E.g., a double followed by a int. You may have to read/write
: the data one by one.
: If you write a C-mex file to read it, you can define a data structure of one
: double and one int, them read the structure instead of reading the
: individual elements. It will be much faster.

H***a
发帖数: 735
14
谢谢回复.如我上面贴出来的代码,数据类型也就是int, double(本来是读complex<
double>,似乎更慢,但差别不大)。测试都是在同一个Linux服务器,难道Matlab对内
存的操作这么不济?

【在 C*********g 的大作中提到】
: 这个......IDL和matlab对于数据类型的定义是不太一样的。如果matlab读了5分钟,几
: 乎可以肯定你设置的数据类型导致占用的内存超过了物理内存,所以一下子慢了。

r****t
发帖数: 10904
15
就是使用 matlab 的数据结构,用 load 来读数据,这是他们期望你的用法。

【在 H***a 的大作中提到】
: 怎么样叫matlab's way?能否展开说说?谢谢。
t****t
发帖数: 6806
16
你这样写是C的写法, matlab不是这样写的. matlab的写法比这个快10倍以上(跟你的循
环次数有关)没问题.

【在 H***a 的大作中提到】
: 我用下面这段code读的,请指教,谢谢!
: for procID=0:(numProcs-1)
: fileName = sprintf('%d-DATA.dat', procID);
: data = fopen(fileName, 'r');
:
: if data ~= -1
: numFreqs = fread(data, 1, 'long');
: numLocations = fread(data, 1, 'long');
:
: for m=1:numLocations

t****t
发帖数: 6806
17
把你的内循环
for w=1:numFreqs
re = fread(data, 1, 'double');
im = fread(data, 1, 'double');
%Ey(x,y,z,w) = complex(re, im);
Ey_re(x,y,z,w) = re;
Ey_im(x,y,z,w) = im;
end
变成
A=fread(data, [2 numFreqs], 'double');
Ex_re(x,y,z,1:numFreqs)=A(1,:);
Ex_im(x,y,z,1:numFreqs)=A(2,:);
我没看明白你的程序, 你把内循环写三遍是啥意思?
H***a
发帖数: 735
18
haha,我也发现了这个问题,正打算来发贴说改进了以后大概只要1分钟了:) 没错,正
如您说的一样,原来太stupid了,连续的数据部分还用loop读,汗。。。
分三个loop来读是因为我有x,y,z三块数据(连续的,每块长度2*numFreqs),想付给x
,y,z三个变量,这个似乎应该也有改进的办法。
看来的确是我个人的问题,非常感谢!!这个版有您是件幸事:)

【在 t****t 的大作中提到】
: 把你的内循环
: for w=1:numFreqs
: re = fread(data, 1, 'double');
: im = fread(data, 1, 'double');
: %Ey(x,y,z,w) = complex(re, im);
: Ey_re(x,y,z,w) = re;
: Ey_im(x,y,z,w) = im;
: end
: 变成
: A=fread(data, [2 numFreqs], 'double');

t****t
发帖数: 6806
19
嗯, 这回我看明白了
可以这样写
for procID=0:(numProcs-1)
fileName = sprintf('%d-DATA.dat', procID);
data = fopen(fileName, 'r');
if data ~= -1
numFreqs = fread(data, 1, 'long');
numLocations = fread(data, 1, 'long');
pos=ftell(data);
xyz=fread(data, [3 numLocations], "3*long", numFreqs*3*2*8)+1;
fseek(data, pos+3*4, -1);
dataformat=sprintf('%d*double', 2*3*numfreqs);
Exyz=fread(data, [2 3*numfreqs*numLocations], dataformat, 3*4);
Exyz=complex(Exyz(1,:), Exyz(2,:));
Exyz=reshape(Exyz, [numFreqs 3 numLocations]
t****t
发帖数: 6806
20
这才是matlab的真正能力, 能不用循环就不要用

【在 t****t 的大作中提到】
: 嗯, 这回我看明白了
: 可以这样写
: for procID=0:(numProcs-1)
: fileName = sprintf('%d-DATA.dat', procID);
: data = fopen(fileName, 'r');
: if data ~= -1
: numFreqs = fread(data, 1, 'long');
: numLocations = fread(data, 1, 'long');
: pos=ftell(data);
: xyz=fread(data, [3 numLocations], "3*long", numFreqs*3*2*8)+1;

相关主题
Perl and Matlab Questionsize of structure
一个简单的算法问题?c里从文件读数据,什么方法比较好?
matlab中如何调用cc的文件写入问题
进入Programming版参与讨论
a****l
发帖数: 8211
21
however, if IDL can do it in 5-10 seconds and matlab in 1 minute, that's
still quite significant difference. Any more reasons?

【在 t****t 的大作中提到】
: 这才是matlab的真正能力, 能不用循环就不要用
t****t
发帖数: 6806
22
1分钟那是把内循环优化掉
我写的是整个都优化掉了, 不过楼主消失了而已

【在 a****l 的大作中提到】
: however, if IDL can do it in 5-10 seconds and matlab in 1 minute, that's
: still quite significant difference. Any more reasons?

H***a
发帖数: 735
23
太牛了,大赞!! 改完后读数据只要6秒钟,跟IDL一样了!!

【在 t****t 的大作中提到】
: 嗯, 这回我看明白了
: 可以这样写
: for procID=0:(numProcs-1)
: fileName = sprintf('%d-DATA.dat', procID);
: data = fopen(fileName, 'r');
: if data ~= -1
: numFreqs = fread(data, 1, 'long');
: numLocations = fread(data, 1, 'long');
: pos=ftell(data);
: xyz=fread(data, [3 numLocations], "3*long", numFreqs*3*2*8)+1;

H***a
发帖数: 735
24
厉害!我matlab写得太少了,现在才明白原来matlab的code也可以写得这么漂亮!

【在 t****t 的大作中提到】
: 这才是matlab的真正能力, 能不用循环就不要用
H***a
发帖数: 735
25
呵呵,周末乱七八糟的事情忙忘了,抱歉哈,俺马上写个小结。

【在 t****t 的大作中提到】
: 1分钟那是把内循环优化掉
: 我写的是整个都优化掉了, 不过楼主消失了而已

H***a
发帖数: 735
26
yes
H***a
发帖数: 735
27
非常感谢各位的回复和帮助,特别感谢thrust和acectl。问题得到很好的解决,俺学习
长进之余来个小小结,也方便以后的参考。
俺土人一枚,之前几乎没用Matlab写过什么程序,一般也就GUI读读数据作图。这次比
较了Matlab和IDL读取大量数据的能力,对Matlab有了新的认识:Matlab在处理大量数
据和多维数组方面并不像“传说”中的那样比IDL差很多,关键是要使用合适的格式,
尽量按vector的思路来操作而避免过多使用for loop。
前面说过,数据是由一堆分散的文件构成,总量500MB。
组里的Share-Memory Linux server, 8个Dual-Core AMD Opteron(tm) Processor 8216
(CPU MHz: 2412.404, Cache size: 1024 KB), Totoal Memory: 66GB
IDL花时6秒,关键在于使用了preloaded的数据template,效率很高。
Matlab方面,一开始我使用了大量的for loop,耗时达5分钟以上!后来优化了内部循
环,速度提高到1分钟;再后来在thrus
t****t
发帖数: 6806
28
呵呵, 很好. 不知道我写TODO的部分你是怎么写的, 理论上来说那部分也可以不用循环
. 不过我觉得5秒钟再往下优化余地不大了, 而且还要照顾I/O的时间.

【在 H***a 的大作中提到】
: 太牛了,大赞!! 改完后读数据只要6秒钟,跟IDL一样了!!
r****t
发帖数: 10904
29
看来 matlab for loop overhead 也比较大。

【在 t****t 的大作中提到】
: 这才是matlab的真正能力, 能不用循环就不要用
k****f
发帖数: 3794
30
matlab程序就是要求尽量少用for loop,
多用矩阵类型的操作的

【在 r****t 的大作中提到】
: 看来 matlab for loop overhead 也比较大。
相关主题
a linux disk IO question (转载)c++产生随机数
c++如何把小数转成二进制输出到文本文件?怎样读一个不断更新的文件
c语言如何pass变量的值ask a question about struct in C programming
进入Programming版参与讨论
H***a
发帖数: 735
31
我想我最好修改一下我simulation的代码,调整一下输出顺序,同时输出对于每个数据
块而言的xSize, ySize和zSize,这样我希望能通过
Ex(:,xyz(1,:),xyz(2,:),xyz(3,:))=reshape(Exyz(:,:,1), [numFreqs,xSize, ySize, zSize])
来实现读取。等试过再来报告:)

【在 t****t 的大作中提到】
: 呵呵, 很好. 不知道我写TODO的部分你是怎么写的, 理论上来说那部分也可以不用循环
: . 不过我觉得5秒钟再往下优化余地不大了, 而且还要照顾I/O的时间.

l*****n
发帖数: 1068
32
matlab的优化是有很多trick,掌握了,程序的速度可以飞速的提高
k**f
发帖数: 372
33

One of them is to use the built-in profiler to find out where the program
spends its time.

【在 l*****n 的大作中提到】
: matlab的优化是有很多trick,掌握了,程序的速度可以飞速的提高
H***a
发帖数: 735
34
感谢thrust提供的优化,感谢kkff在“Matlab处理数组一问”这贴中回复教了俺
sub2ind这个无比好用的函数,现在程序优化如下。
测试结果:耗时8秒。非常赞!
Ex = zeros(numFreqs,sizeX,sizeY,sizeZ);
Ey = zeros(numFreqs,sizeX,sizeY,sizeZ);
Ez = zeros(numFreqs,sizeX,sizeY,sizeZ);
for procID=0:(numProcs-1)
fileName = sprintf('%d-NearFieldDFT.dat', procID);
data = fopen(fileName, 'r');

if data ~= -1
numPoints = fread(data, 3, 'int');
totNumPoints = numPoints(1)*numPoints(2)*numPoints(3);

xyz=fread(data,[3 totNumPoints],'int
t****t
发帖数: 6806
35
怎么比上次慢了? 另外你把数据结构改了啊?
H***a
发帖数: 735
36
ind = sub2ind([sizeX sizeY sizeZ], xyz(1,:), xyz(2,:), xyz(3,:));
Ex(:,ind) = Exyz(:,:,1);
Ey(:,ind) = Exyz(:,:,2);
Ez(:,ind) = Exyz(:,:,3);
这部分是您代码里的To do部分,把每个文件读到小块数据放入装整体数据的4维矩阵,
这个要占点时间吧。是的,也只是小的变动,我把坐标(x,y,z)连续输出,然后再输出
各个点相应的数值(numFreqs x 3 x totNumPoints)。

【在 t****t 的大作中提到】
: 怎么比上次慢了? 另外你把数据结构改了啊?
k**f
发帖数: 372
37

挑一个小毛病:在procID循环结束时没有关文件 data。
再给个小tip:
totNumPoints = numPoints(1)*numPoints(2)*numPoints(3);
可以写成
totNumPoints = prod(numPoints);

【在 H***a 的大作中提到】
: 感谢thrust提供的优化,感谢kkff在“Matlab处理数组一问”这贴中回复教了俺
: sub2ind这个无比好用的函数,现在程序优化如下。
: 测试结果:耗时8秒。非常赞!
: Ex = zeros(numFreqs,sizeX,sizeY,sizeZ);
: Ey = zeros(numFreqs,sizeX,sizeY,sizeZ);
: Ez = zeros(numFreqs,sizeX,sizeY,sizeZ);
: for procID=0:(numProcs-1)
: fileName = sprintf('%d-NearFieldDFT.dat', procID);
: data = fopen(fileName, 'r');
:

d******n
发帖数: 42
38
d******n
发帖数: 42
39
could it be that you did not preallocate the memory for your matrix in
matlab?
if not, that can be very slow!
H***a
发帖数: 735
40
非常感谢,文件俺还是关了的,只是没贴出来,写C++这个习惯还是有的,嘿嘿:)
现在非常喜欢matlab,的确挺好用:)

【在 k**f 的大作中提到】
:
: 挑一个小毛病:在procID循环结束时没有关文件 data。
: 再给个小tip:
: totNumPoints = numPoints(1)*numPoints(2)*numPoints(3);
: 可以写成
: totNumPoints = prod(numPoints);

1 (共1页)
进入Programming版参与讨论
相关主题
c里从文件读数据,什么方法比较好?[合集] visual c++中读二进制图形文件的奇怪问题
c的文件写入问题请教一个文件IO的问题
a linux disk IO question (转载)linux怎么读入一个超过有超过1B integer的binary file? (转载)
c++如何把小数转成二进制输出到文本文件?serialization 到底该怎么理解啊?
c语言如何pass变量的值我这个读写文本文件的程序为什么第一次总是出错?
c++产生随机数C语言程序静态库和动态库的创建及其应用
怎样读一个不断更新的文件open an image file
ask a question about struct in C programmingPerl and Matlab Question
相关话题的讨论汇总
话题: matlab话题: data话题: numfreqs话题: fread话题: idl