Я тоже изучаю Erlang, спасибо за интересный вопрос.
Я понимаю, что работа со строками Erlang так как списки символов могут быть очень медленными;если вы можете работать с двоичными файлами , вы должны увидеть некоторое увеличение производительности.Я не знаю, как бы вы использовали строки произвольной длины с двоичными файлами, но если вы можете разобраться с этим, это должно помочь.
Кроме того, если вы не против работать с файлом напрямую, а не standard_io
, возможно, вы могли бы ускорить процесс, используя file:open(..., [raw, read_ahead])
.raw
означает, что файл должен находиться в файловой системе локального узла, а read_ahead
указывает, что Erlang должен выполнить IO файла с буфером.(Подумайте об использовании средств stdio в C с буферизацией и без нее.)
Я бы ожидал, что read_ahead
будет иметь наибольшее значение, но все, что есть в Erlang, включает фразу "эталон перед угадыванием".1015 * РЕДАКТИРОВАТЬ
Использование file:open("uniprot_sprot.fasta", [read, read_ahead])
дает 1m31s
для полного набора данных uniprot_sprot.fasta.(Среднее 359.04679841439776.)
Используя file:open(.., [read, read_ahead])
и file:read_line(S)
, я получаю 0m34s
.
Используя file:open(.., [read, read_ahead, raw])
и file:read_line(S)
, я получаю 0m9s
.Да, девять секунд.
Вот где я стою сейчас;если вы сможете понять, как использовать двоичные файлы вместо списков, это может привести к еще большему улучшению:
-module(golf).
-export([test/0]).
line([],{Sequences,Total}) -> {Sequences,Total};
line(">" ++ Rest,{Sequences,Total}) -> {Sequences+1,Total};
line(L,{Sequences,Total}) -> {Sequences,Total+string:len(string:strip(L))}.
scanLines(S,Sequences,Total)->
case file:read_line(S) of
eof -> {Sequences,Total};
{error,_} ->{Sequences,Total};
{ok, Line} -> {S2,T2}=line(Line,{Sequences,Total}), scanLines(S,S2,T2)
end .
test()->
F = file:open("/home/sarnold/tmp/uniprot_sprot.fasta", [read, read_ahead, raw]),
case F of
{ ok, File } ->
{Sequences,Total}=scanLines(File,0,0),
io:format("~p\n",[Total/(1.0*Sequences)]);
{ error, Reason } ->
io:format("~s", Reason)
end,
halt().