【发布时间】:2016-09-26 00:49:03
【问题描述】:
我有一个读取 csv 文件 (100M) 的小程序。问题是我的程序使 Erlang 解释器崩溃:
Crash dump was written to: erl_crash.dump
eheap_alloc: Cannot reallocate 3563526520 bytes of memory (of type "heap").
Aborted
这是程序:
readlines(FileName) ->
{ok, Device} = file:open(FileName, [read]),
try get_all_lines(Device)
after file:close(Device)
end.
get_all_lines(Device) ->
case io:get_line(Device, "") of
eof -> [];
Line -> [Line | get_all_lines(Device)]
end.
我愿意:
Path="...csv".
Lines=tut6:readlines(Path).
这会导致崩溃。
谁能告诉我问题是什么?也许我的程序有问题?如何避免崩溃?
提前致谢
【问题讨论】:
-
它是否适用于较小的文件?
-
你对每一行分别做了什么?通过逐行处理文件而不是将所有行收集到一个列表中,您可能会获得更大的成功。
-
@A.萨里德。它确实适用于较小的文件。
-
@nu-ex。是的,你可能是对的。但无论如何,我需要将 CSV 内容存储在列表和哈希表等中。所以也许内存使用仍然会使解释器崩溃。你以前听说过这样的事情吗?
-
在操作之前将 100MB 文件加载到内存中并不是我遇到的要求。你能告诉我们更多关于你正在尝试做的事情吗?您可以考虑将 CSV 数据导入数据库,例如 mnesia、DETS 甚至 PostgreSQL 或 MySQL 并根据需要获取。
标签: erlang