I have no problem with mine version, it does about 5MB/s for me.<br><br><div class="gmail_quote">On Fri, Apr 24, 2009 at 9:08 PM, Per Melin <span dir="ltr"><<a href="mailto:per.melin@gmail.com">per.melin@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Per Melin:<br>
<div class="im">> Anders Nygren:<br>
>> Per Melin:<br>
>>> It is known that once you queue up a few tens of thousand messages<br>
>>> into a mailbox your performance drops noticeably for doing a receive.<br>
>><br>
>> I hope You meant when doing a SELECTIVE receive, right.<br>
><br>
> Of course. I've been away from Erlang for too long (again). I'm really<br>
> sorry for the misinformation.<br>
<br>
</div>At this point I should just be quiet, but I can't help myself.<br>
<br>
The performance characteristics of this problem makes it look like<br>
there's indeed a selective recieve in there somewhere. When opening<br>
the file in raw mode I didn't expect that. But:<br>
<br>
1) The file:write gets faster and faster as the size of the message<br>
queue shrinks.<br>
<br>
2) If you change the writer so that it waits for an ack from the<br>
listener between each send the problem goes away.<br>
<br>
I don't have time to learn the ins and outs of the prim_file module,<br>
but I did a quick trace and I suspect prim_file:drv_get_response/1<br>
(which does a selective receive) is the culprit.<br>
<br>
Anyway, here's a fast synchronous version of the original code:<br>
<div class="im"><br>
start(Filename) -> register(testLogger,spawn(testLogger,listener,[Filename])).<br>
<br>
listener(Filename) -><br>
</div>    case file:open(Filename,[append, raw]) of<br>
<div class="im">        {ok,Fd} -> listener(Fd,0);<br>
        {error,Reason} -> error_logger:error_msg(Reason)<br>
    end.<br>
<br>
listener(Fd,N) -><br>
    receive<br>
</div>        {data, From, Data} -><br>
            file:write(Fd,Data),<br>
            From ! ack,<br>
<div class="im">            listener(Fd,N+1);<br>
        {count,From} -> From ! {count,N}, listener(Fd,N);<br>
        {stop,From} -> From ! {stop,success}<br>
    end.<br>
<br>
write(_Data,0) -> {ok,done};<br>
write(Data,N) -><br>
</div>    testLogger ! {data, self(), Data},<br>
    receive<br>
        _ -> ok<br>
    end,<br>
    write(Data,N-1).<br>
<div><div></div><div class="h5">_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>--Hynek (Pichi) Vychodil<br><br>Analyze your data in minutes. Share your insights instantly. Thrill your boss.  Be a data hero!<br>Try Good Data now for free: <a href="http://www.gooddata.com">www.gooddata.com</a><br>