y****k 发帖数: 71 | 1 【 以下文字转载自 Programming 讨论区 】
发信人: ystdpk (ystdpk), 信区: Programming
标 题: c++ thread 求助
发信站: BBS 未名空间站 (Fri Jan 31 21:12:20 2014, 美东)
有一个50 million 行的文本。每行四列数字。
要求每行求一个特殊函数的值,把此值输出为第五列。次函数的求值所花的时间可能很
快,如果四个数比较小, 也可能要花到10几到100倍的时间如果数比较大。
想用36个boost thread。
有没有人能提供一个boost thread 的代码。谢谢了。
我写了一个下面的,但是cpu浪费比较严重,有的thread 结束早,有的结束慢。而且不
知道2000行一个thread是不是好的选择。
int batchSize = 2000;
int num_of_lines = 50100100;
bool end_of_file = false;
int pstart = 0;
boost::thread_group io;
while( ! end_of_file )
{
boost::thread_group g;
vector > out;
out.resize(num_of_threads);
for( int i = 0; i < num_of_threads; )
{
if(num_of_lines - pstart < BATCHMAX)
{
batchSize = num_of_lines - pstart;
boost::thread *tp = new boost::thread( worker, batchSize
, boost::ref(out[i]) );
g.add_thread(tp);
pstart = pstart + batchSize;
i++;
end_of_file = true;
break;
}
else
{
boost::thread *tp = new boost::thread( worker, batchSize
, boost::ref(out[i]) );
g.add_thread(tp);
pstart = pstart + batchSize;
i++;
}
}
g.join_all();
io.join_all();
boost::thread *tprint = new boost::thread( appendToFile, boost::ref(File
), out);
io.add_thread(tprint);
} |
P***y 发帖数: 2885 | 2 why not consider using Excel?
【在 y****k 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: ystdpk (ystdpk), 信区: Programming : 标 题: c++ thread 求助 : 发信站: BBS 未名空间站 (Fri Jan 31 21:12:20 2014, 美东) : 有一个50 million 行的文本。每行四列数字。 : 要求每行求一个特殊函数的值,把此值输出为第五列。次函数的求值所花的时间可能很 : 快,如果四个数比较小, 也可能要花到10几到100倍的时间如果数比较大。 : 想用36个boost thread。 : 有没有人能提供一个boost thread 的代码。谢谢了。 : 我写了一个下面的,但是cpu浪费比较严重,有的thread 结束早,有的结束慢。而且不
|
b*w 发帖数: 14917 | |
T*U 发帖数: 22634 | 4 perl
【在 y****k 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: ystdpk (ystdpk), 信区: Programming : 标 题: c++ thread 求助 : 发信站: BBS 未名空间站 (Fri Jan 31 21:12:20 2014, 美东) : 有一个50 million 行的文本。每行四列数字。 : 要求每行求一个特殊函数的值,把此值输出为第五列。次函数的求值所花的时间可能很 : 快,如果四个数比较小, 也可能要花到10几到100倍的时间如果数比较大。 : 想用36个boost thread。 : 有没有人能提供一个boost thread 的代码。谢谢了。 : 我写了一个下面的,但是cpu浪费比较严重,有的thread 结束早,有的结束慢。而且不
|
R****2 发帖数: 342 | 5 如果只做一次的话,为啥不把文件切割开然后同时开n个程序一起跑? 简单暴力高效 |
b***y 发帖数: 14281 | 6 没功夫看你的code,但是正确的做法不是平均分配任务给所有thread,而是所有thread
共享一个文件流,大家轮流一行行做,就不存在那个thread先结束的问题。
pseudo code大致如此
thread.run(file_handler) :
file_handler.lock()
while(file_handler)
{
job=file_handler.read_a_line()
file_handler.release()
do_some_time_consuming_things(job)
file_handler.lock()
}
file_handler.release()
return 0
main_thread()
{
file_handler=open_file(....)
...
for(i=0;i
{
new_thread=thread()
new_thread.run(file_handler)
thread_list.append(new_thread)
}
for(i=0;i
{
thread_list[i].join()
}
....
}
【在 y****k 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: ystdpk (ystdpk), 信区: Programming : 标 题: c++ thread 求助 : 发信站: BBS 未名空间站 (Fri Jan 31 21:12:20 2014, 美东) : 有一个50 million 行的文本。每行四列数字。 : 要求每行求一个特殊函数的值,把此值输出为第五列。次函数的求值所花的时间可能很 : 快,如果四个数比较小, 也可能要花到10几到100倍的时间如果数比较大。 : 想用36个boost thread。 : 有没有人能提供一个boost thread 的代码。谢谢了。 : 我写了一个下面的,但是cpu浪费比较严重,有的thread 结束早,有的结束慢。而且不
|
t*****g 发帖数: 1275 | 7 什么函数这么慢?确定瓶颈不在disk io?
【在 y****k 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: ystdpk (ystdpk), 信区: Programming : 标 题: c++ thread 求助 : 发信站: BBS 未名空间站 (Fri Jan 31 21:12:20 2014, 美东) : 有一个50 million 行的文本。每行四列数字。 : 要求每行求一个特殊函数的值,把此值输出为第五列。次函数的求值所花的时间可能很 : 快,如果四个数比较小, 也可能要花到10几到100倍的时间如果数比较大。 : 想用36个boost thread。 : 有没有人能提供一个boost thread 的代码。谢谢了。 : 我写了一个下面的,但是cpu浪费比较严重,有的thread 结束早,有的结束慢。而且不
|
y****k 发帖数: 71 | 8 非常感谢回复。真的学到东西了。
不过我还想问一下。
如果一次lock读入2000行会不会快点?
另外一个问题是,用这种方法有没有什么方法保证输出和原来的文本一样的顺序?
thread
【在 b***y 的大作中提到】 : 没功夫看你的code,但是正确的做法不是平均分配任务给所有thread,而是所有thread : 共享一个文件流,大家轮流一行行做,就不存在那个thread先结束的问题。 : pseudo code大致如此 : thread.run(file_handler) : : file_handler.lock() : while(file_handler) : { : job=file_handler.read_a_line() : file_handler.release() : do_some_time_consuming_things(job)
|
y****k 发帖数: 71 | 9 what is CUDA?
【在 b*w 的大作中提到】 : 用CUDA?
|
y****k 发帖数: 71 | 10 必须是C++因为这个函数求解只在c++中有
【在 T*U 的大作中提到】 : perl
|
|
|
y****k 发帖数: 71 | 11 有不少步求积分
【在 t*****g 的大作中提到】 : 什么函数这么慢?确定瓶颈不在disk io?
|
r********n 发帖数: 7441 | 12 每个thread应该锁定一个block来处理,否则效率太低
36个thread根本没必要,4-8个就足够用了
thread
【在 b***y 的大作中提到】 : 没功夫看你的code,但是正确的做法不是平均分配任务给所有thread,而是所有thread : 共享一个文件流,大家轮流一行行做,就不存在那个thread先结束的问题。 : pseudo code大致如此 : thread.run(file_handler) : : file_handler.lock() : while(file_handler) : { : job=file_handler.read_a_line() : file_handler.release() : do_some_time_consuming_things(job)
|
y****k 发帖数: 71 | 13 block该选多大有啥说法吗?
【在 r********n 的大作中提到】 : 每个thread应该锁定一个block来处理,否则效率太低 : 36个thread根本没必要,4-8个就足够用了 : : thread
|
t*****g 发帖数: 1275 | 14 如果算比读还慢,起上N个thread(N=#core),每个thread死循环处理读上来的下一行。
【在 y****k 的大作中提到】 : 有不少步求积分
|
y****k 发帖数: 71 | 15 再顶这个问题:
有没有什么方法保证输出和原来的文本一样的顺序? |
b***y 发帖数: 14281 | 16 取决于算一次用多少时间,如果一次计算用秒以上的时间的话则没多少区别,如果算一
次还是比较快的话可以一次抓个几十行来提高效率。这是很显然的事情吧。
【在 r********n 的大作中提到】 : 每个thread应该锁定一个block来处理,否则效率太低 : 36个thread根本没必要,4-8个就足够用了 : : thread
|
a*i 发帖数: 126 | 17 读一行,attach 一个行号。
输出都丢到一个buffer里 (linked-list?),再起一个thread 作输出。
【在 y****k 的大作中提到】 : 再顶这个问题: : 有没有什么方法保证输出和原来的文本一样的顺序?
|
b***y 发帖数: 14281 | 18 Good solution. Just make sure to lock the index properly when reading the
file.
【在 a*i 的大作中提到】 : 读一行,attach 一个行号。 : 输出都丢到一个buffer里 (linked-list?),再起一个thread 作输出。
|
y****k 发帖数: 71 | 19 大牛们,
可不可以讲一下这个attach 是什么意思。
linked list 又如何通过行号保持原来的顺序。是等所有的计算结束了再输出这个排序
了的list吗?
求详细点解释。
【在 b***y 的大作中提到】 : Good solution. Just make sure to lock the index properly when reading the : file.
|
a*i 发帖数: 126 | 20 attach 没啥特别的意思。
把读入的每一行当作一个object对待。这个object还有一些fields可以hold行号和运算
结果。
给行号的index是全局递增的变量,所以不同的thread access的时候要注意lock.
兄弟还在学校吧?这都是工业界常规solution。不牛。
【在 y****k 的大作中提到】 : 大牛们, : 可不可以讲一下这个attach 是什么意思。 : linked list 又如何通过行号保持原来的顺序。是等所有的计算结束了再输出这个排序 : 了的list吗? : 求详细点解释。
|
|
|
b*w 发帖数: 14917 | 21 GPU的并行处理更快吧
【在 y****k 的大作中提到】 : what is CUDA?
|
b*w 发帖数: 14917 | 22 另外创建thread的数目时,也要考虑CPU本身有几个虚拟的processors,太多threads不
一定能提高效率 |
y****k 发帖数: 71 | 23 不好意思。的确在学校。
我的想法是建立一个map KeyLineNum_ValueOutput.
只要定义好了 < operator, 这个就是自动安LineNum排序的。 等所有行都处理完了就
可以输出了。不过这样搞感觉浪费内存。
不是很明白这个linked list 可以如何一边计算一边保持原来的顺序用一个thread输出
【在 a*i 的大作中提到】 : attach 没啥特别的意思。 : 把读入的每一行当作一个object对待。这个object还有一些fields可以hold行号和运算 : 结果。 : 给行号的index是全局递增的变量,所以不同的thread access的时候要注意lock. : 兄弟还在学校吧?这都是工业界常规solution。不牛。
|
h******k 发帖数: 13418 | 24 需要两个buffer,一个io thread,总thread不超过总vcpu,thread全部bind |
a*i 发帖数: 126 | 25 对,这个map只能保证有序,不能保证连续。
只有都处理完,才能保证连续.
Linked list 的意思就是每个thread输出结果时,自己保证有序插入.
不过, 我觉得你的map比list 好, 这个buffer用map比较好。
【在 y****k 的大作中提到】 : 不好意思。的确在学校。 : 我的想法是建立一个map KeyLineNum_ValueOutput. : 只要定义好了 < operator, 这个就是自动安LineNum排序的。 等所有行都处理完了就 : 可以输出了。不过这样搞感觉浪费内存。 : 不是很明白这个linked list 可以如何一边计算一边保持原来的顺序用一个thread输出
|
l*********u 发帖数: 19053 | 26 有。divide and conquer
split出来的小files是按字母排的,算好后再按字母cat回去。
【在 y****k 的大作中提到】 : 再顶这个问题: : 有没有什么方法保证输出和原来的文本一样的顺序?
|