e********r 发帖数: 2352 | 1 程序里现在需要一个很大的Matrix, 以前写的时候是放在一个文件里,每次程序执行的
时候现读入,这样很浪费时间,现在把整个Matrix写成一个array存在程序里作global
variable,但是编译的时候很慢,要十几分钟的样子,而且编译出来的程序很大,请问
各位一般处理大的矩阵时候是如何处理的,谢谢哈. |
A**u 发帖数: 2458 | 2 要不空间换时间
要不时间换空间
global
【在 e********r 的大作中提到】 : 程序里现在需要一个很大的Matrix, 以前写的时候是放在一个文件里,每次程序执行的 : 时候现读入,这样很浪费时间,现在把整个Matrix写成一个array存在程序里作global : variable,但是编译的时候很慢,要十几分钟的样子,而且编译出来的程序很大,请问 : 各位一般处理大的矩阵时候是如何处理的,谢谢哈.
|
e********r 发帖数: 2352 | 3 俺现在就是空间换时间,矩阵大概有三十多M, compile之后的程序有六十多M,但是
compile的过程很慢,要好久,而且在好几个机器上都报错说内存不够,好容易找了个
能compile的机子,只是这方面没有什么经验,不知道一般专业人士都是怎么设计的结
构.
【在 A**u 的大作中提到】 : 要不空间换时间 : 要不时间换空间 : : global
|
A**u 发帖数: 2458 | 4 你为啥要放在 global呢
global的变量放在静态存储区,我不太了解,不过一般不会放矩阵这样大的数据
【在 e********r 的大作中提到】 : 俺现在就是空间换时间,矩阵大概有三十多M, compile之后的程序有六十多M,但是 : compile的过程很慢,要好久,而且在好几个机器上都报错说内存不够,好容易找了个 : 能compile的机子,只是这方面没有什么经验,不知道一般专业人士都是怎么设计的结 : 构.
|
e********r 发帖数: 2352 | 5 不设为gobal,那就是当作局域变量放在主函数里,然后传地址给其他函数,那效果是
一样的,其实主要问题就是矩阵太大,compile的时候很慢,在执行的时候主要时间就
是把程序读入内存,但是放在文件里每次现读执行的时候很慢,在多循环调动的时候有
点不现实, 请问各位有没有处理大的矩阵的经验,指导一下哈.
【在 A**u 的大作中提到】 : 你为啥要放在 global呢 : global的变量放在静态存储区,我不太了解,不过一般不会放矩阵这样大的数据
|
B**W 发帖数: 2273 | 6 不太明白你这程序逻辑。
过去俺们是把大数据存在文件里,读的时候用Memory File, 就是一下子把整个文件从
硬盘扔进一个内存文件,然后再读内存,速度极快,因为理论上就一次磁盘IO调用。数
据读完了再做成静态变量或者全局变量就行了。
global
【在 e********r 的大作中提到】 : 程序里现在需要一个很大的Matrix, 以前写的时候是放在一个文件里,每次程序执行的 : 时候现读入,这样很浪费时间,现在把整个Matrix写成一个array存在程序里作global : variable,但是编译的时候很慢,要十几分钟的样子,而且编译出来的程序很大,请问 : 各位一般处理大的矩阵时候是如何处理的,谢谢哈.
|
e********r 发帖数: 2352 | 7 请问能详细解释一下Memory file的概念吗,没有用过,是需要安装其他系统支持吗.
【在 B**W 的大作中提到】 : 不太明白你这程序逻辑。 : 过去俺们是把大数据存在文件里,读的时候用Memory File, 就是一下子把整个文件从 : 硬盘扔进一个内存文件,然后再读内存,速度极快,因为理论上就一次磁盘IO调用。数 : 据读完了再做成静态变量或者全局变量就行了。 : : global
|
H***a 发帖数: 735 | |
b*****e 发帖数: 1193 | |
e********r 发帖数: 2352 | 10 这个本来就是给并行的一个节点写的,再并行一下结构太复杂了哈,谢谢建议哈.
【在 H***a 的大作中提到】 : 可以考虑用并行.
|
|
|
e********r 发帖数: 2352 | 11 其实是这个程序已经写完,准备贴在网上让别人下来用的,如果不能用纯C++的方法解
决的话可能意义对俺不大,谢谢指点.
【在 b*****e 的大作中提到】 : 做个ram disk,自己google吧
|
r********3 发帖数: 2998 | 12 你以前的方法是对的。你现在的方法简直就是胡扯。
你才20,30M的文件,根本不算大。多半是你写的disk I/O写的不够好。
global
【在 e********r 的大作中提到】 : 程序里现在需要一个很大的Matrix, 以前写的时候是放在一个文件里,每次程序执行的 : 时候现读入,这样很浪费时间,现在把整个Matrix写成一个array存在程序里作global : variable,但是编译的时候很慢,要十几分钟的样子,而且编译出来的程序很大,请问 : 各位一般处理大的矩阵时候是如何处理的,谢谢哈.
|
r********3 发帖数: 2998 | 13 你可以去查一下。现在大部分笔记本硬盘的速度,多是在30-40mbytes/s以上。也就是
说,几乎不到1秒的时间就可以读入你的Matrix。跟真正处理数据的程序比起来,你这
个30M的文件根本只能算个toy。
为什么慢,估计原因很简单,就是你程序没写好了而已。楼上扯什么ram disk,并行这
些,根本就是杀鸡用牛刀。。。
真正用mapreduce等并行处理的,都至少是上G的数据,数量级都差了2个。
global
【在 e********r 的大作中提到】 : 程序里现在需要一个很大的Matrix, 以前写的时候是放在一个文件里,每次程序执行的 : 时候现读入,这样很浪费时间,现在把整个Matrix写成一个array存在程序里作global : variable,但是编译的时候很慢,要十几分钟的样子,而且编译出来的程序很大,请问 : 各位一般处理大的矩阵时候是如何处理的,谢谢哈.
|
e********r 发帖数: 2352 | 14 可能你说的是对的,以前的数据存在几千个文件里,每个都不大,但是I/O操作很慢,
现在做到一个文件里,可能直接读入和直接写成global的Array速度差不多,俺可以试
试,现在的结构也是用的俺以前实验室一个postdoc的程序方法,他一直把数据做成一
个很大的Array然后直接compile, 谢谢哈.
【在 r********3 的大作中提到】 : 你以前的方法是对的。你现在的方法简直就是胡扯。 : 你才20,30M的文件,根本不算大。多半是你写的disk I/O写的不够好。 : : global
|
r********3 发帖数: 2998 | 15 如果再不行,你可以考虑使用数据库。把数据存在数据库里面。数据库系统对于disk I
/O以及内存的读写切换,基本上都是最优化的。
【在 e********r 的大作中提到】 : 可能你说的是对的,以前的数据存在几千个文件里,每个都不大,但是I/O操作很慢, : 现在做到一个文件里,可能直接读入和直接写成global的Array速度差不多,俺可以试 : 试,现在的结构也是用的俺以前实验室一个postdoc的程序方法,他一直把数据做成一 : 个很大的Array然后直接compile, 谢谢哈.
|
n****n 发帖数: 59 | 16 maybe try serialization |
y*****4 发帖数: 33 | 17 最土的方法:先用二进制全部直接读到内存,然后再分析。
别用cin或fscanf这种方式就可以了 |
j******s 发帖数: 387 | 18 计算的程序不要矩阵,另外写个包含矩阵并且做成service负责响应提取矩阵内容的要
求,
计算的程序需要数据的时候通过服务去取,
数据变的时候重新编译service,计算程序debug的时候重新编译计算程序
global
【在 e********r 的大作中提到】 : 程序里现在需要一个很大的Matrix, 以前写的时候是放在一个文件里,每次程序执行的 : 时候现读入,这样很浪费时间,现在把整个Matrix写成一个array存在程序里作global : variable,但是编译的时候很慢,要十几分钟的样子,而且编译出来的程序很大,请问 : 各位一般处理大的矩阵时候是如何处理的,谢谢哈.
|
e********r 发帖数: 2352 | 19 谢谢哈.
I
【在 r********3 的大作中提到】 : 如果再不行,你可以考虑使用数据库。把数据存在数据库里面。数据库系统对于disk I : /O以及内存的读写切换,基本上都是最优化的。
|
e********r 发帖数: 2352 | 20 请问用二进制如何操作,俺以前写的二进制文档还是用stream读入的,这和cin和
fscanf差别不大吧,谢谢指教.
【在 y*****4 的大作中提到】 : 最土的方法:先用二进制全部直接读到内存,然后再分析。 : 别用cin或fscanf这种方式就可以了
|
|
|
e********r 发帖数: 2352 | 21 这位的方法听上去很复杂,请问能详细说一下吗,你说的数据变的时候重新编译是什么
意思,是runtime编译吗,谢谢哈
【在 j******s 的大作中提到】 : 计算的程序不要矩阵,另外写个包含矩阵并且做成service负责响应提取矩阵内容的要 : 求, : 计算的程序需要数据的时候通过服务去取, : 数据变的时候重新编译service,计算程序debug的时候重新编译计算程序 : : global
|
r********3 发帖数: 2998 | 22 恩,直接memcpy的方法是快一些。不过他这个才30M的小文件,即便用fscanf也不会慢
到哪里去。
【在 y*****4 的大作中提到】 : 最土的方法:先用二进制全部直接读到内存,然后再分析。 : 别用cin或fscanf这种方式就可以了
|
e********r 发帖数: 2352 | 23 请问你的意思是俺把矩阵转成Binary file, 然后用memcpy读入? 请问能给个例子吗
? 俺读一下你的code,这样可能清楚些,谢谢哈.
【在 r********3 的大作中提到】 : 恩,直接memcpy的方法是快一些。不过他这个才30M的小文件,即便用fscanf也不会慢 : 到哪里去。
|
r********3 发帖数: 2998 | 24 FILE *fp;
int* matrix = new int[30*1024*1024];
fp=fopen("test", "rb")
fread(matrix, 30*1024*1024*sizeof(int), 1, fp)
fclose(fp);
【在 e********r 的大作中提到】 : 请问你的意思是俺把矩阵转成Binary file, 然后用memcpy读入? 请问能给个例子吗 : ? 俺读一下你的code,这样可能清楚些,谢谢哈.
|
n*******0 发帖数: 2002 | 25 呃,放在文件里很方便啊。如果你觉得慢可以试试用软件把一块内存虚拟成磁盘,然后
把文件放在ramdisk里。
global
【在 e********r 的大作中提到】 : 程序里现在需要一个很大的Matrix, 以前写的时候是放在一个文件里,每次程序执行的 : 时候现读入,这样很浪费时间,现在把整个Matrix写成一个array存在程序里作global : variable,但是编译的时候很慢,要十几分钟的样子,而且编译出来的程序很大,请问 : 各位一般处理大的矩阵时候是如何处理的,谢谢哈.
|
e********r 发帖数: 2352 | 26 谢谢哈.
【在 r********3 的大作中提到】 : FILE *fp; : int* matrix = new int[30*1024*1024]; : fp=fopen("test", "rb") : fread(matrix, 30*1024*1024*sizeof(int), 1, fp) : fclose(fp);
|
e********r 发帖数: 2352 | 27 俺也觉得是这样子,之前慢可能是数据分散在很多文件里哈.
【在 n*******0 的大作中提到】 : 呃,放在文件里很方便啊。如果你觉得慢可以试试用软件把一块内存虚拟成磁盘,然后 : 把文件放在ramdisk里。 : : global
|
kx 发帖数: 16384 | 28 我猜他指的是不是 File Mapping ?
把文件映射到内存里去
msdn 里能查到
算基本api
不过我不懂
件从
。数
【在 e********r 的大作中提到】 : 请问能详细解释一下Memory file的概念吗,没有用过,是需要安装其他系统支持吗.
|
e********r 发帖数: 2352 | 29 谢谢提示哈.
【在 kx 的大作中提到】 : 我猜他指的是不是 File Mapping ? : 把文件映射到内存里去 : msdn 里能查到 : 算基本api : 不过我不懂 : : 件从 : 。数
|