由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Linux版 - 【包子求助】20M*20M的loop怎么搞? (转载)
相关主题
有没有什么分割桌面或屏幕的工具类似于grid新手求教C++对于矩阵的操作必须是一堆for循环吗?
现在有一个巨大的程序要编程minimum path sum的滚动数组啥意思
Scientific Linux菜鸟求问一个二维数组指针的问题 c++
raspberry pi cluster在四维中拿三维里的东西, 真这么容易?
看来这个10.4 问题多多,我还是要坚持住不要升级。如何复制一个二维数组?
ubuntu10.04比9.1有什么提高?[合集] 怎样拷贝一个二维数组?
为什么一个indicator要5.5M内存?问个模板函数的问题
请教matlab,将一个二维的矩阵扩展到三维的最简单的办法?问一道面试题, 关于算法 (转载)
相关话题的讨论汇总
话题: 20m话题: num话题: grid话题: points话题: cell
进入Linux版参与讨论
1 (共1页)
i***r
发帖数: 1035
1
【 以下文字转载自 Programming 讨论区 】
发信人: iiiir (哎呀我最牛), 信区: Programming
标 题: 【包子求助】20M*20M的loop怎么搞?
发信站: BBS 未名空间站 (Fri Sep 14 14:51:39 2012, 美东)
我有2个文件A和B,各自约20 million lines
现在我要check的是,B的每一行中的第一个数字,是否落入A的某一行的第一第二数字
之间。
比较直观的是,我写2个loop
for i=1:length(A)
for k=1:length(B)
do what I want to check...
end
end
问题是20M*20M似乎太长,我的电脑化了2个小时,才算到i=600左右,也就是跑了600*
20M loops
请问大虾们,怎么整。我用的是matlab,C也可以用,python也可以考虑。。。
多谢了,解决问题的发包子
G*****h
发帖数: 33134
2
用 C 吧
这俩文件不大呀,整数的话,A 80MB B 160MB 空间就都读内存里了
然后就傻 loop 也不会花太久

【在 i***r 的大作中提到】
: 【 以下文字转载自 Programming 讨论区 】
: 发信人: iiiir (哎呀我最牛), 信区: Programming
: 标 题: 【包子求助】20M*20M的loop怎么搞?
: 发信站: BBS 未名空间站 (Fri Sep 14 14:51:39 2012, 美东)
: 我有2个文件A和B,各自约20 million lines
: 现在我要check的是,B的每一行中的第一个数字,是否落入A的某一行的第一第二数字
: 之间。
: 比较直观的是,我写2个loop
: for i=1:length(A)
: for k=1:length(B)

w****w
发帖数: 521
3
用perl,方便且较快。
把第一个文件的数分成区间,做个hash,key是区间,value是个list,即所有在区间里
的数。然后把hash sort一下,读第二个文件,再到hash里找区间,处理一下重叠的情
况就行了。
i***r
发帖数: 1035
4
perl不会。。。可能最后要用2楼的方法。
我的文件实际上要复杂些,除了数字还有gene序列在后面,找到交叉后我要去找对应的
gene信息。
我现在是一行一行的scan A(然后去和B的每一行找交叉),可能这就是程序慢的主要
因素?
包子随后奉上,先多谢了
l******n
发帖数: 1683
5
这个活一定不能用matlab, 那会慢死. 另外A的任意行前两个数字构成的区间都不重叠
么?

【在 i***r 的大作中提到】
: 【 以下文字转载自 Programming 讨论区 】
: 发信人: iiiir (哎呀我最牛), 信区: Programming
: 标 题: 【包子求助】20M*20M的loop怎么搞?
: 发信站: BBS 未名空间站 (Fri Sep 14 14:51:39 2012, 美东)
: 我有2个文件A和B,各自约20 million lines
: 现在我要check的是,B的每一行中的第一个数字,是否落入A的某一行的第一第二数字
: 之间。
: 比较直观的是,我写2个loop
: for i=1:length(A)
: for k=1:length(B)

w*r
发帖数: 2421
w****w
发帖数: 521
7
给SNP annotate?你这个是单个chromosome还是whole genome?

【在 i***r 的大作中提到】
: perl不会。。。可能最后要用2楼的方法。
: 我的文件实际上要复杂些,除了数字还有gene序列在后面,找到交叉后我要去找对应的
: gene信息。
: 我现在是一行一行的scan A(然后去和B的每一行找交叉),可能这就是程序慢的主要
: 因素?
: 包子随后奉上,先多谢了

w****w
发帖数: 521
8
这个东东我写过个C# library,把gene按chromosome分好后排序,然后再搜SNP,不应该
超过一个小时。
n******7
发帖数: 12463
9
恩,感觉lz是要做这个
我也做过类似的,sort是关键,还有就是chr by chr来做

【在 w****w 的大作中提到】
: 这个东东我写过个C# library,把gene按chromosome分好后排序,然后再搜SNP,不应该
: 超过一个小时。

i***r
发帖数: 1035
10
谢谢大家,我确实是要搜SNP,chromosome都排好序了,sort过了,稍微优化了一下,
一会儿晚上看看跑了多少。
包子已发,谢谢
PS 这里有没有new jersey附近做生物信息的?pm我大家认识下?
相关主题
ubuntu10.04比9.1有什么提高?新手求教C++对于矩阵的操作必须是一堆for循环吗?
为什么一个indicator要5.5M内存?minimum path sum的滚动数组啥意思
请教matlab,将一个二维的矩阵扩展到三维的最简单的办法?菜鸟求问一个二维数组指针的问题 c++
进入Linux版参与讨论
o**n
发帖数: 1249
11
借机问一个问题。我有一个较大的二维矩阵,是(x,y)坐标矩阵,float type,x,y都没
有规则顺序。我再建一个x,y mesh grid的矩阵,间距是均匀的或有一定规律比如线性
增加等,要把前面那个乱的(x,y)矩阵放入grid里,会有多个(x,y)落在同一个grid的情
况,把每个grid中有的(x,y)在原矩阵中的行列index记录下来。其实就是个二维monte
carlo的东西。我现在也是用loop硬来,目前用matlab,用C肯定快一些。数组也不是特
别大,run一次大概几分钟时间,但我要做很多次这个事情,想请教大家更好的方法。

【在 G*****h 的大作中提到】
: 用 C 吧
: 这俩文件不大呀,整数的话,A 80MB B 160MB 空间就都读内存里了
: 然后就傻 loop 也不会花太久

y***d
发帖数: 2330
12
你是说 loop grid 花时间?弄个 dirty set 就行了吧 ...都不用,算 xy 的 grid 时
候记录 index 就成了?

monte

【在 o**n 的大作中提到】
: 借机问一个问题。我有一个较大的二维矩阵,是(x,y)坐标矩阵,float type,x,y都没
: 有规则顺序。我再建一个x,y mesh grid的矩阵,间距是均匀的或有一定规律比如线性
: 增加等,要把前面那个乱的(x,y)矩阵放入grid里,会有多个(x,y)落在同一个grid的情
: 况,把每个grid中有的(x,y)在原矩阵中的行列index记录下来。其实就是个二维monte
: carlo的东西。我现在也是用loop硬来,目前用matlab,用C肯定快一些。数组也不是特
: 别大,run一次大概几分钟时间,但我要做很多次这个事情,想请教大家更好的方法。

G*****h
发帖数: 33134
13
有序序列,二分搜索好了

monte

【在 o**n 的大作中提到】
: 借机问一个问题。我有一个较大的二维矩阵,是(x,y)坐标矩阵,float type,x,y都没
: 有规则顺序。我再建一个x,y mesh grid的矩阵,间距是均匀的或有一定规律比如线性
: 增加等,要把前面那个乱的(x,y)矩阵放入grid里,会有多个(x,y)落在同一个grid的情
: 况,把每个grid中有的(x,y)在原矩阵中的行列index记录下来。其实就是个二维monte
: carlo的东西。我现在也是用loop硬来,目前用matlab,用C肯定快一些。数组也不是特
: 别大,run一次大概几分钟时间,但我要做很多次这个事情,想请教大家更好的方法。

o**n
发帖数: 1249
14
我去查查dirty set。
我没太搞懂你说的第二个
我现在是两层loop grid,用matlab的矩阵比较把index搞出来,类似
for jx=1:nx
ix = xt>x(jx) & xt<=x(jx)+dx;
for jy=1:ny
iy = yt>y(jy) & yt<=y(jy)+dy;
ixy = ix&iy;
#use ixy to process data ...
end
end
xt,yt是(x,y)坐标的二维数据nx*ny,其实是我有一个矩阵数据A,每个数据点对应一个
(x,y)坐标,A(i,j) -> (x,y)。上面code中的x,y是新建的均匀grid,每个间距dx,dy。
我不太理解你说的意思。

【在 y***d 的大作中提到】
: 你是说 loop grid 花时间?弄个 dirty set 就行了吧 ...都不用,算 xy 的 grid 时
: 候记录 index 就成了?
:
: monte

o**n
发帖数: 1249
15
我猜如果我用matlab里矩阵的比较时,比如A(i,j)>B(i,j)返回所有满足条件的数据行
列index,应该用的是很优化的算发,我的理解是matlab建议用户尽量用矩阵形式避免
用loop就是他内部优化的结果。但我要对每个grid点和原数据都做一次这个比较,所以
费时,请参见我贴出的code。

【在 G*****h 的大作中提到】
: 有序序列,二分搜索好了
:
: monte

y***d
发帖数: 2330
16
俺完全没看懂... 当我没说...

【在 o**n 的大作中提到】
: 我去查查dirty set。
: 我没太搞懂你说的第二个
: 我现在是两层loop grid,用matlab的矩阵比较把index搞出来,类似
: for jx=1:nx
: ix = xt>x(jx) & xt<=x(jx)+dx;
: for jy=1:ny
: iy = yt>y(jy) & yt<=y(jy)+dy;
: ixy = ix&iy;
: #use ixy to process data ...
: end

l***y
发帖数: 4671
17
竟然用 matlab 做大规模的多重循环?这都是在哪里学的 matlab?要是在我的班上,
作业一律零分。

【在 i***r 的大作中提到】
: 谢谢大家,我确实是要搜SNP,chromosome都排好序了,sort过了,稍微优化了一下,
: 一会儿晚上看看跑了多少。
: 包子已发,谢谢
: PS 这里有没有new jersey附近做生物信息的?pm我大家认识下?

o**n
发帖数: 1249
18
请教我前面那个例子怎么避免二重循环或在matlab里怎么能做的更有效些?谢谢!

【在 l***y 的大作中提到】
: 竟然用 matlab 做大规模的多重循环?这都是在哪里学的 matlab?要是在我的班上,
: 作业一律零分。

G*****h
发帖数: 33134
19
matlab 也就在学校用用
不会也没事

【在 l***y 的大作中提到】
: 竟然用 matlab 做大规模的多重循环?这都是在哪里学的 matlab?要是在我的班上,
: 作业一律零分。

j**u
发帖数: 6059
20
这里的人C专家众多,但是matlab的编程方式很不一样,很多时候是靠点小聪明,而不
是什么算法的。
你的问题,我的理解是平面上很多点,你知道每个点的坐标,现在在平面上画一个棋盘
格子,然后需要知道每个格子里面是那些点?如果是这样的话,可以比较简单的用
matlab的矩阵来进行计算:
1. 每个点的x和y是可以分开考虑的(因为x轴垂直于y轴)
2. 根据你的棋盘格子离散化x和y矩阵,例如x=x0+nx*dx,这个nx就是x这个点在棋盘格
子里的位置,nx是正整数
3. 新得倒的nx和ny矩阵就是你(x,y)坐标矩阵在棋盘格子的新坐标矩阵。利用逻辑矩阵
,很容易找出棋盘格子里任意一格包含的所有点的坐标

monte

【在 o**n 的大作中提到】
: 借机问一个问题。我有一个较大的二维矩阵,是(x,y)坐标矩阵,float type,x,y都没
: 有规则顺序。我再建一个x,y mesh grid的矩阵,间距是均匀的或有一定规律比如线性
: 增加等,要把前面那个乱的(x,y)矩阵放入grid里,会有多个(x,y)落在同一个grid的情
: 况,把每个grid中有的(x,y)在原矩阵中的行列index记录下来。其实就是个二维monte
: carlo的东西。我现在也是用loop硬来,目前用matlab,用C肯定快一些。数组也不是特
: 别大,run一次大概几分钟时间,但我要做很多次这个事情,想请教大家更好的方法。

相关主题
在四维中拿三维里的东西, 真这么容易?问个模板函数的问题
如何复制一个二维数组?问一道面试题, 关于算法 (转载)
[合集] 怎样拷贝一个二维数组?如何将MATLAB已生成的二维等值线图变为三维视图?
进入Linux版参与讨论
j**u
发帖数: 6059
21
有点糊涂了,你最终的目的是什么?

【在 o**n 的大作中提到】
: 我去查查dirty set。
: 我没太搞懂你说的第二个
: 我现在是两层loop grid,用matlab的矩阵比较把index搞出来,类似
: for jx=1:nx
: ix = xt>x(jx) & xt<=x(jx)+dx;
: for jy=1:ny
: iy = yt>y(jy) & yt<=y(jy)+dy;
: ixy = ix&iy;
: #use ixy to process data ...
: end

G*****7
发帖数: 1759
22
no need to bother with quadtree
float / mesh_grid_size = index of containing cell

【在 G*****h 的大作中提到】
: 有序序列,二分搜索好了
:
: monte

G*****7
发帖数: 1759
23
function fast_grid_lookup
%% prepare the data
% randomly generate the query points
num_points = 20e6;
points = rand(num_points,2);
% specify the evenly-spaced mesh grid
num_divs = 1028; % per side
num_cells = num_divs^2;
grid_spacing = 1/(num_divs-1);
% you do not have to instantiate the grid points by
% grid = meshgrid(linspace(0, 1, num_div), linspace(0, 1, num_div));
%% find the enclosing cell of each point
tic;
points_in_cell = ceil(points/grid_spacing)+1; % damn you, 1-based matlab
toc;
%% one-shot query: which points are within a given cell,
% for instance, the cell at the center
i=num_divs/2;
j=num_divs/2;
cell_idx = [i, j];
tic;
points_idx_1 = find( points_in_cell(:,1)==cell_idx(1) & points_in_cell(:,2)=
=cell_idx(2) );
toc;
%% amalgamate the cell-point membership into a sparse matrix
tic;
cell_indices = sub2ind([num_divs,num_divs], points_in_cell(:,1), points_in_
cell(:,2));
point_indices = 1:num_points;
indicator = ones(1, num_points);
cell_point = sparse(cell_indices, point_indices, indicator, num_cells, num_
points);
toc;
% query like this
tic;
points_idx_2 = cell_point(sub2ind([num_divs, num_divs], i, j), :);
toc;
assert( all(transpose(points_idx_1) == find(points_idx_2)) );
end

monte

【在 o**n 的大作中提到】
: 借机问一个问题。我有一个较大的二维矩阵,是(x,y)坐标矩阵,float type,x,y都没
: 有规则顺序。我再建一个x,y mesh grid的矩阵,间距是均匀的或有一定规律比如线性
: 增加等,要把前面那个乱的(x,y)矩阵放入grid里,会有多个(x,y)落在同一个grid的情
: 况,把每个grid中有的(x,y)在原矩阵中的行列index记录下来。其实就是个二维monte
: carlo的东西。我现在也是用loop硬来,目前用matlab,用C肯定快一些。数组也不是特
: 别大,run一次大概几分钟时间,但我要做很多次这个事情,想请教大家更好的方法。

G*****7
发帖数: 1759
24
1) for-free. the time taken is minimal. for 20 million points in 1024^2
grids, it took me < 5 seconds.
2) trivial to extend to cases with dx!=dy.

【在 G*****7 的大作中提到】
: function fast_grid_lookup
: %% prepare the data
: % randomly generate the query points
: num_points = 20e6;
: points = rand(num_points,2);
: % specify the evenly-spaced mesh grid
: num_divs = 1028; % per side
: num_cells = num_divs^2;
: grid_spacing = 1/(num_divs-1);
: % you do not have to instantiate the grid points by

G*****7
发帖数: 1759
25
i m gonna repeat what ppl said in programming:
1) if you have to explicitly do for-loop and linearly search for the
interval membership, use mex to embed c/cpp code in matlab.
2) if you got time, check out the search acceleration data structures
provided by, say cgal, such as segment tree, and write mex+cpp code that
takes advantage of that.

【在 i***r 的大作中提到】
: 谢谢大家,我确实是要搜SNP,chromosome都排好序了,sort过了,稍微优化了一下,
: 一会儿晚上看看跑了多少。
: 包子已发,谢谢
: PS 这里有没有new jersey附近做生物信息的?pm我大家认识下?

o**n
发帖数: 1249
26
多谢思考我的问题和读我的code,先包子一个。我觉得你的方法好像比我的code那个好
一些,我去试试看。
我的问题表达得不太好,让很多人糊涂了。我再试着说一遍:
有一个二维面上离散化的物理量A=A(i,j),0 过一些过程后对应到另一个二维面上,每个点在新二维面上坐标变了且与在初始面上的
坐标没有单调关系,i.e.每个A(i,j)在新面的坐标为(x(i,j),y(i,j))。我现在需要知
道这个物理量在新的二维面上的分布。所以在新面上重新做grid,这样就不可避免有多
个点落在同一个grid格子里,如果是这样,就把这个格子里的所有点的物理量值相加,
最后再做一个二维内插平滑化,就能得出在新面上的物理量分布了。其实是个monte
carlo的东西,当然在初始面离散的越细(点越多),最后在新面上的分布就越准确连
续平滑一些。
希望我说明白了。

【在 j**u 的大作中提到】
: 这里的人C专家众多,但是matlab的编程方式很不一样,很多时候是靠点小聪明,而不
: 是什么算法的。
: 你的问题,我的理解是平面上很多点,你知道每个点的坐标,现在在平面上画一个棋盘
: 格子,然后需要知道每个格子里面是那些点?如果是这样的话,可以比较简单的用
: matlab的矩阵来进行计算:
: 1. 每个点的x和y是可以分开考虑的(因为x轴垂直于y轴)
: 2. 根据你的棋盘格子离散化x和y矩阵,例如x=x0+nx*dx,这个nx就是x这个点在棋盘格
: 子里的位置,nx是正整数
: 3. 新得倒的nx和ny矩阵就是你(x,y)坐标矩阵在棋盘格子的新坐标矩阵。利用逻辑矩阵
: ,很容易找出棋盘格子里任意一格包含的所有点的坐标

o**n
发帖数: 1249
27
thanks for your code! baozi first. I'll read the code and try it.

【在 G*****7 的大作中提到】
: function fast_grid_lookup
: %% prepare the data
: % randomly generate the query points
: num_points = 20e6;
: points = rand(num_points,2);
: % specify the evenly-spaced mesh grid
: num_divs = 1028; % per side
: num_cells = num_divs^2;
: grid_spacing = 1/(num_divs-1);
: % you do not have to instantiate the grid points by

o**n
发帖数: 1249
28
just looked through your code. I think you and jzxu used the same concept
which is a much better way than what I did. And your code can be simply
revised to deal with non-uniform grid. Thanks for your help!!

【在 G*****7 的大作中提到】
: function fast_grid_lookup
: %% prepare the data
: % randomly generate the query points
: num_points = 20e6;
: points = rand(num_points,2);
: % specify the evenly-spaced mesh grid
: num_divs = 1028; % per side
: num_cells = num_divs^2;
: grid_spacing = 1/(num_divs-1);
: % you do not have to instantiate the grid points by

G*****7
发帖数: 1759
29
a better way to explain your problem to a programmer is to abstract out the
non-essentials (离散点经过一些过程, 物理量值相加,二维内插平滑化, 物理量分布,
monte carlo...), and tell them what is your input (points and grid) and
what is the desired output (cell-point membership).

【在 o**n 的大作中提到】
: 多谢思考我的问题和读我的code,先包子一个。我觉得你的方法好像比我的code那个好
: 一些,我去试试看。
: 我的问题表达得不太好,让很多人糊涂了。我再试着说一遍:
: 有一个二维面上离散化的物理量A=A(i,j),0: 过一些过程后对应到另一个二维面上,每个点在新二维面上坐标变了且与在初始面上的
: 坐标没有单调关系,i.e.每个A(i,j)在新面的坐标为(x(i,j),y(i,j))。我现在需要知
: 道这个物理量在新的二维面上的分布。所以在新面上重新做grid,这样就不可避免有多
: 个点落在同一个grid格子里,如果是这样,就把这个格子里的所有点的物理量值相加,
: 最后再做一个二维内插平滑化,就能得出在新面上的物理量分布了。其实是个monte
: carlo的东西,当然在初始面离散的越细(点越多),最后在新面上的分布就越准确连

o**n
发帖数: 1249
30
thanks for your advise!

the
布,

【在 G*****7 的大作中提到】
: a better way to explain your problem to a programmer is to abstract out the
: non-essentials (离散点经过一些过程, 物理量值相加,二维内插平滑化, 物理量分布,
: monte carlo...), and tell them what is your input (points and grid) and
: what is the desired output (cell-point membership).

相关主题
问一道面试题, 关于算法 (转载)现在有一个巨大的程序要编程
twitter电面Scientific Linux
有没有什么分割桌面或屏幕的工具类似于gridraspberry pi cluster
进入Linux版参与讨论
z***r
发帖数: 131
31
bedtools

【在 i***r 的大作中提到】
: 【 以下文字转载自 Programming 讨论区 】
: 发信人: iiiir (哎呀我最牛), 信区: Programming
: 标 题: 【包子求助】20M*20M的loop怎么搞?
: 发信站: BBS 未名空间站 (Fri Sep 14 14:51:39 2012, 美东)
: 我有2个文件A和B,各自约20 million lines
: 现在我要check的是,B的每一行中的第一个数字,是否落入A的某一行的第一第二数字
: 之间。
: 比较直观的是,我写2个loop
: for i=1:length(A)
: for k=1:length(B)

N8
发帖数: 110
32
河马新马甲?

【在 l***y 的大作中提到】
: 竟然用 matlab 做大规模的多重循环?这都是在哪里学的 matlab?要是在我的班上,
: 作业一律零分。

1 (共1页)
进入Linux版参与讨论
相关主题
问一道面试题, 关于算法 (转载)看来这个10.4 问题多多,我还是要坚持住不要升级。
如何将MATLAB已生成的二维等值线图变为三维视图?ubuntu10.04比9.1有什么提高?
问一道面试题, 关于算法 (转载)为什么一个indicator要5.5M内存?
twitter电面请教matlab,将一个二维的矩阵扩展到三维的最简单的办法?
有没有什么分割桌面或屏幕的工具类似于grid新手求教C++对于矩阵的操作必须是一堆for循环吗?
现在有一个巨大的程序要编程minimum path sum的滚动数组啥意思
Scientific Linux菜鸟求问一个二维数组指针的问题 c++
raspberry pi cluster在四维中拿三维里的东西, 真这么容易?
相关话题的讨论汇总
话题: 20m话题: num话题: grid话题: points话题: cell