Каков самый эффективный путь со времени, использованного для чтения текстового файла в список двоичных строк в erlang? Очевидное решение
-module(test).
-export([run/1]).
open_file(FileName, Mode) ->
{ok, Device} = file:open(FileName, [Mode, binary]),
Device.
close_file(Device) ->
ok = file:close(Device).
read_lines(Device, L) ->
case io:get_line(Device, L) of
eof ->
lists:reverse(L);
String ->
read_lines(Device, [String | L])
end.
run(InputFileName) ->
Device = open_file(InputFileName, read),
Data = read_lines(Device, []),
close_file(Device),
io:format("Read ~p lines~n", [length(Data)]).
становится слишком медленным, когда файл содержит больше чем 100 000 строк.
{ok, Bin} = file:read_file(Filename).
Или если вам нужно строку содержимого по строке
read(File) ->
case file:read_line(File) of
{ok, Data} -> [Data | read(File)];
eof -> []
end.
считывает весь файл в двоичном формате. Преобразовать в список и вырезать строки.
Это намного эффективнее, чем любой другой метод. Если вы не верите мне время это.
file2lines(File) -> {ok, Bin} = file:read_file(File), string2lines(binary_to_list(bin), []). string2lines("\n" ++ Str, Acc) -> [reverse([$\n|Acc]) | string2lines(Str,[])]; string2lines([H|T], Acc) -> string2lines(T, [H|Acc]); string2lines([], Acc) -> [reverse(Acc)].