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比较方便,是不是没有更好的办法了? : 请大家给点意见。多谢!
| | | 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;
| | | 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 | | 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 也比较大。
| | | 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 | | 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 | | 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);
|
|