Concurrency Erlang-打开文件读取行删除行并保存

Concurrency Erlang-打开文件读取行删除行并保存,concurrency,erlang,otp,Concurrency,Erlang,Otp,我需要打开一个文件,读取该行,做一些事情,删除该行并保存,再次打开同一个文件,然后继续其余的操作 到目前为止,我有这个代码 1 -module(setup_data). 2 -export([for_each_line_in_file/1]). 3 4 for_each_line_in_file(Name) -> 5 {ok, Device} = file:open(Name, [read]), 6 for_each_line(Device).

我需要打开一个文件,读取该行,做一些事情,删除该行并保存,再次打开同一个文件,然后继续其余的操作

到目前为止,我有这个代码

  1 -module(setup_data).
  2 -export([for_each_line_in_file/1]).
  3 
  4 for_each_line_in_file(Name) ->
  5     {ok, Device} = file:open(Name, [read]),
  6     for_each_line(Device).
  7 
  8 for_each_line(Device) ->
  9     case io:get_line(Device, "") of
 10         eof  -> file:close(Device);
 11         Line ->
 12                 do_something(Line)
 13                 for_each_line(Device)
 14     end.
所以我想要像这样的东西

  1 -module(setup_data).
  2 -export([for_each_line_in_file/1]).
  3 
  4 for_each_line_in_file(Name) ->
  4
  6     for_each_line(Name).
  7 
  8 for_each_line(Device) ->
  9      {ok, Device} = file:open(Name, [read]),
  9     case io:get_line(Device, "") of
 10         eof  -> file:close(Device);
 11         Line ->
 12                 io:format("LINE :  ......  ~p~n",[Line]),
 23                  
 43                 /DELETE THAT CURRENT LINE AND SAVE?
 33                 file:close(Device) 
 13                 for_each_line(Name)
 14     end.

要详细说明Armon的评论:

在服务器故障问答网站上,有一篇关于。文件中第一行的磁盘搜索需要10毫秒,而读取1Mb连续数据需要30毫秒。如果您的文件有300行,您的解决方案的工作速度将慢10倍,如果它有3000行,它将比读取1Mb od数据慢100倍


在这种情况下,将整个文件作为二进制文件读入内存,对这些行执行所需操作,最后再次保存该文件。您可以在进程之间分配工作,但我不会费心,因为访问磁盘可能是代码中最长的操作。

您应该考虑重写,因为打开和关闭文件非常苛刻。也许使用一个读的过程,一个写的过程(而不是创建一个新文件)?为什么这个问题被标记为elixir?为什么这个问题被标记为ejabberd?