论坛首页 编程语言技术论坛

erlang读文件的速度为啥这么慢?

浏览 10749 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-08-21  

        今天公司技术比武,比赛题目是给一个1.1g的大文本,统计文本中词频最高的前十个词。花了两天用erlang写完了代码,但是放到公司16核的机器上这么一跑,结果不比不知道,一比吓一条。erlang写的代码执行时间花了55秒左右,同事们有的用java,有的用C,还有的用C++,用C最快一个老兄只花了2.6秒,用java的也只用了3.2秒。相比之下erlang的代码,真是一头大蜗牛,太慢了。

        但是我想实际测试一下,别的都不测,先测试一下用erlang遍历完一个1.1G的文本到底要花多久(只遍历,其他啥都不做)。

        代码如下:

          

-module(file_read).

-export([read/1]).


read(File)->
case file:open(File, [ raw, binary]) of
           {ok, Fd} ->
			   scan_file(Fd,file:read(Fd, 1024));
           {error, Reason} ->
                  {error, Reason}
end	.


scan_file(Fd, {ok, Binary}) ->
    scan_file(Fd, file:read(Fd, 1024));
scan_file(Fd,  eof) ->
    file:close(Fd);
scan_file(Fd,  {error, Reason}) ->
    file:close(Fd).

 在打开文件的地方特地用了option是[ raw, binary],这样可以保证在打开文件erlang不会起一个额外的进程,并且是以二进制流的方式去打开文件,应该是最快了。

  但是经过测试:

timer:tc(file_read,read,["d:\\download\\doc\\doc.txt"]).

 结果确是:

{26286000,ok}

 整整花了26秒,就算在16核的机器上,把文件切成16份,用16各进程去读文件,读完文件也要花 26/16=1.6秒,这还只是光读文件所要花的时间,没有算上其他计算词频所用的时间。

   

  貌似erlang在计算密集型的计算上确实比其他语言没有啥优势

   发表时间:2013-08-22  
为什么要用文件IO? 你方法用错了吧, 才1.1G大小的文件,直接内存映射啊
0 请登录后投票
   发表时间:2013-08-22  
对于大文件,唯一的读写除了内存映射,几乎没有更好的方法。你确定你是通过内存映射的方式?
0 请登录后投票
   发表时间:2013-08-22  
erlang的优势是并行运算
0 请登录后投票
   发表时间:2013-08-22  
1024太小了,设置大一点试试
0 请登录后投票
   发表时间:2013-08-26  
统计是中英文字符都有的文件吗?
0 请登录后投票
   发表时间:2013-08-28   最后修改:2013-08-28
直接用 file:read_file/1 方法,在微秒级内完成读入,然后把数据拆分成若干份,分发到不同的进程处理,再合并结果,速度可能比不上C,但不会比Java差。

下面的方法读入 1G的文件只用了500多微秒(8核,16G的机器)。
read2(File) ->
	{ok,Binary} = file:read_file(File),
ok.
0 请登录后投票
   发表时间:2013-08-28  
我写了一篇erlang和其他语言读文件性能大比拼:
http://blog.yufeng.info/archives/2842

结论是:
我们采用的块大小是1M, 三种模式下对应的读取时间分别是0.322, 0.779, 0.214s,相比dd的0.264s, 我们可以看到多线程模式比c还快,单线程一次读和c差不多。带宽达到4-5G,是理论值的极限,也证明我们把这个事情做到极致了。
1 请登录后投票
   发表时间:2013-08-28  
哎,不好意思各位了,我写的代码是在windows跑的,我现在明白原来windows和linux的区别不是一点点呀。

另外,windows上erlang启动的时候 +A 16 的参数启动io线程池的参数是无效的,只有跑在linux上才会有效果。
0 请登录后投票
   发表时间:2013-08-29  
我昨天做了题目,读文件+统计在我的机器上花了大概5秒时间。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics