【问题标题】:How can I read a text file with size 6GB in Erlang?如何在 Erlang 中读取大小为 6GB 的文本文件?
【发布时间】:2021-09-17 01:43:45
【问题描述】:

我有 6 GB 的文本文件。我想读取这个文件并解析每一行的数据并将其保存在我的数据库中。但由于内存问题,不可能一次处理整个 6 GB 文件。那么如何逐块读取数据然后进行处理呢?

【问题讨论】:

    标签: string file parsing erlang


    【解决方案1】:

    类似这样的:

    process_file(Filename) ->
        {ok, F} = file:open(Filename, [read]),
        process_lines(F).
    
    process_lines(F) ->
        case file:read_line(F) of
            {ok, Line} ->
                %% do something with Line
                process_lines(F);
            eof ->
                file:close(F)
        end.
    

    【讨论】:

    • 但是即使这样阅读,由于内存分配问题,它也会崩溃。连第一行都看不懂。 eheap_alloc: Cannot allocate 105746219880 bytes of memory (of type "heap_frag")
    • 这种类型的代码不应该耗尽内存——垃圾收集应该能够回收用于已读取行的内存。很可能您的其他一些代码正在尝试分配 105 GB。
    • 我不知道为什么,但它正在制造问题。我没有在这台服务器上运行任何其他代码,它是一个规格相当不错的服务器。无论如何,我正在尝试将文件作为块或小部分读取。它的工作到现在为止。
    【解决方案2】:

    也许你可以试试read 功能。它允许一个参数来限制文件中的字节数或字符数。

    【讨论】:

    • 是的,我现在正在尝试这样做。让我们看看情况如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2015-12-13
    • 2015-10-14
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多