Самый эффективный способ считать файл в список строк

Каков самый эффективный путь со времени, использованного для чтения текстового файла в список двоичных строк в 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 строк.

9
задан Konstantin 31 January 2010 в 10:25
поделиться

2 ответа

{ok, Bin} = file:read_file(Filename).

Или если вам нужно строку содержимого по строке

read(File) ->
    case file:read_line(File) of
        {ok, Data} -> [Data | read(File)];
        eof        -> []
    end.
16
ответ дан 4 December 2019 в 11:04
поделиться

считывает весь файл в двоичном формате. Преобразовать в список и вырезать строки.

Это намного эффективнее, чем любой другой метод. Если вы не верите мне время это.

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)].
3
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: