`
vanadiumlin
  • 浏览: 504847 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

(转)Erlang的config文件读取效率问题

 
阅读更多
[Erl_Question19]Erlang的config文件读取效率问题 - 学贵有恒

时间 2014-08-23 11:30:00   博客园-原创精华区   
原文  http://www.cnblogs.com/zhongwencool/p/erlang_config_transform.html




方法
优点
缺点


1.把配置文件统一读取到存储介质中(ets表或mysql)

统一管理,可以方便跨节点分布Reload, Erlang Application就是把configuration 文件给读到一个叫ac_tab 的ets表

如果频繁大量的读取这个全局表,要考虑表的性能哦


2.把配置文件做为*.xml或*.config,用Erlang直接读取xml或config

配置成xml,会方便配置人员(前后端都是xml,容易上手) 配置成config,Erlang读取程序很简单

Erlang不适合读取xml 频繁去读一个硬盘文件明显非常不好


3.把配置文件转化为*.beam文件

查询效率高

几乎没有,当然除了分布式部署有点复杂


于是乎:自己做一个简单的配置转化( 欢迎找Bug,费尽心思你也找不到,因为这代码本来没有Bug,哈哈  ) :

你只要把config放到指定好文件的路径就可以使用:
%%转化get_config_dir()下所有的config文件
%%可检查各config文件的格式是不是key重复或格式是不是{key,Value}
1>configToBeam:config_to_beam().
check Config syntax error"test_duplicate_error.config":Reason:{error,
                                                               key_duplicate,
                                                               1}
check Config syntax error"test_format_error.config":Reason:{error,
                                                            format_error,
                                                            {2,3,test2}}
[{ok,test_best},
{error,"test_duplicate_error.config"},
{error,"test_format_error.config"}]

%%返回所有的{key,Value}
2>test_best:all().
[{4,test4},{3,test3},{2,test2},{1,test}]

%%返回对应Key的Value
3>test_best:lookup(2).
test2
%%如果不存在Key则返回undefined
4>test_best:lookup(12).
undefined

我的测试数据目录放在

1 code:root_dir()++"/config"
2
3 %%里面有4个文件:
4 %%test.txt 不以config的文件检查跳过
5 %%test_best.config 这个是正常配置
6 %%test_format_error.config 不是{key,Value}的配置
7 %%test_duplicate_error.config Key有重复的配置

源代码如下:

  1 %%%-------------------------------------------------------------------
  2 %%% @author zhongwencool@gmail.com
  3 %%% @doc   把对应的.config文件转为.beam文件并更新到内存
  4 %%%        configName:all()       return all key_value
  5 %%%        configName:lookup(Key) return value or undefined
  6 %%% 1.得到目录下文件集合
  7 %%% 2.遍历对每个文件进行转换
  8 %%%   2.1 把文件读入 检查格式
  9 %%%   2.2 把config转化为erl文件
10 %%%   2.2 把erl文件编译成beam文件
11 %%% 3.加载beam文件到内存
12 %%% @end
13 %%% Created : 22. Aug 2014 4:08 PM
14 %%%-------------------------------------------------------------------
15 -module(configToBeam).
16
17 -compile(export_all).
18 %% API
19 -export([config_to_beam/0,config_to_beam/1,get_config_dir/0]).
20
21 %% @doc 把指定目录下全部的config文件都转为.beam文件并加载到内存
22 config_to_beam() ->
23     AllConfigName = get_all_config_name(),
24     [begin
25          config_to_beam(ConfigName)
26      end||ConfigName <- AllConfigName].
27
28 %% @doc 把指定目录下名为ConfigName的config文件转为.beam文件并加载到内存
29 config_to_beam(ConfigName) ->
30     case check_syntax(ConfigName) of
31         {ok, TermList}  ->
32             term_to_beam(ConfigName -- ".config", TermList);
33         Reason ->
34             io:format("check Config syntax error~p:Reason:~p~n",[ConfigName, Reason]),
35             {Reason,ConfigName}
36     end.
37
38 %% @todo 改成你存放.config文件的目录
39 get_config_dir() ->
40     code:root_dir()++"/config".
41
42 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
43 %%%  Internal Function
44 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45 term_to_beam(ModuleName,TermList) ->
46     Erl = term_to_erl(ModuleName,TermList),
47     ModuleName2 = ModuleName++".erl",
48     file:write_file(ModuleName2, Erl, [write, binary, {encoding, utf8}]),
49     compile:file(ModuleName2),
50     ModuleName3 = list_to_atom(ModuleName),
51     code:purge(ModuleName3),
52     code:load_file(ModuleName3),
53     {ok,ModuleName3}.
54
55 term_to_erl(ModuleName,TermList) ->
56     StrValue = lists:flatten(term_to_erl2(TermList,"")),
57     StrList = lists:flatten(io_lib:format("     ~w\n", [TermList])),
58     "
59     -module(" ++ ModuleName ++ ").
60     -export([all/0,lookup/1]).
61
62     all()->"++ StrList ++".
63
64     lookup(Key) ->
65       case Key of
66         " ++ StrValue ++ "
67         _ -> undefined
68     end.
69 ".
70
71 term_to_erl2([],Sum) ->
72     Sum;
73 term_to_erl2([{Key, Value}|Left],Acc) ->
74     term_to_erl2(Left,
75         io_lib:format("       ~w -> ~w;\n",[Key, Value])++Acc).
76
77 get_all_config_name() ->
78     {ok,AllFileName} = file:list_dir(get_config_dir()),
79     lists:filter(fun(FileName) ->
80         case lists:reverse(FileName) of
81             "gifnoc." ++_ -> true;
82             _ -> false
83         end
84     end,AllFileName).
85
86 check_syntax(ConfigName) ->
87     case file:consult(joint_path(ConfigName)) of
88         {ok, TermList = [_|_]} ->
89             check_fromat_duplicate(TermList, []);
90         Reason ->
91             {error, Reason}
92     end.
93
94 joint_path(ConfigName) ->
95     get_config_dir() ++"/" ++ ConfigName.
96
97 check_fromat_duplicate([], Acc) ->
98     {ok, Acc};
99 check_fromat_duplicate([{Key, _Value} = Term|Left], Acc) ->
100     case lists:keymember(Key, 1, Acc) of
101         true -> {error, key_duplicate, Key};
102         false -> check_fromat_duplicate(Left, [Term|Acc])
103     end;
104 check_fromat_duplicate([Term|_],_Acc) ->
105     {error,format_error,Term}.



生活好艰辛可是老子就是这么萌。。。。。。。。。。。。。。。。。。。。
分享到:
评论

相关推荐

    Erlang_Memcache.pdf

    - **配置加载**:`loadConfig(FileName)`用于加载指定配置文件中的信息。 通过以上封装和优化,Erlang的进程字典不仅能够有效实现Memcache服务,还能够灵活适应不断变化的业务需求,确保系统的高效运行和数据的可靠...

    使用erlang连接ES的客户端

    如果是使用Rebar3作为构建工具,可以在`rebar.config`文件中添加如下依赖: ```erlang {deps, [ {es_client, ".*"} ]}. ``` 然后运行`rebar3 compile`命令安装和编译依赖。 **连接Elasticsearch** 连接Elastic...

    erlang-conf:用于将 erlang conf 解析为 JSON 的 NodeJS 模块

    它可能提供了一些API接口,如`parse()`函数,用于读取和解析Erlang Conf文件,返回一个JSON对象。此外,还可能有`stringify()`函数,将JSON对象转换回Erlang Conf格式,便于进行数据的双向转换。 在实际使用中,...

    rabbitmq源码包(rabbitmq+erlang)

    4. 启动RabbitMQ:运行解压后的RabbitMQ服务器二进制文件,它会读取配置文件并启动服务。 在使用过程中,了解如何管理和监控RabbitMQ至关重要,包括如何创建和删除队列、绑定和交换、查看队列状态以及使用RabbitMQ...

    syntaxerl:Erlang的语法检查器

    语法检查器当前支持erlang源文件(.erl),erlang头文件(.hrl),erlang配置(.config,.rel,.script,.app,.app.src),escript文件(.erl,.escript) ,.es),leex文件(.xrl)和yecc文件(.yrl)。...

    rebar exemplar 例子

    Rebar通过读取项目的`rebar.config`文件来获取构建指令。这个文件通常包含项目的基本信息,如源代码路径、依赖库以及编译选项等。例如,一个简单的`rebar.config`可能如下所示: ```erlang {deps, [ {example_dep,...

    Rabbit详细使用手册

    - 此文件不存在时,启动时会自动读取默认的环境变量。 - 若要自定义环境变量,需在 `/etc/rabbitmq/` 目录下创建 `rabbitmq-env.config` 文件。 - 示例:设置服务节点名称 `NODENAME=hare`。 - 注意:在 Windows...

    brunch前端自动化工具教程.zip

    只需在`brunch-config.coffee`配置文件中添加相应的插件即可。 **6. 与其他工具的比较** - **与webpack**:webpack更侧重于模块打包,配置更为复杂,但提供了更多自定义的可能性和强大的性能优化功能。 - **与gulp/...

    RabbitMQ安装配置.docx

    这两个文件分别是Erlang运行时环境和RabbitMQ服务器本身,安装顺序不能颠倒,先安装Erlang,后安装RabbitMQ。 2. **配置RabbitMQ** - **启动CMD窗口**:以管理员权限运行命令提示符(CMD),这是为了执行需要系统...

    exenv:Exenv使从外部资源加载环境变量变得容易

    Exenv 可以读取 `.env` 文件并将其中的变量导入到 Elixir 的环境变量中,这样应用就可以在运行时访问这些值。 接下来是 YAML 文件(YAML Ain't Markup Language),这是一种常见的数据序列化格式,常用于配置文件。...

    elixir_google_spreadsheets:用于读取和写入Google Spreadsheets数据的Elixir库

    Elixir是一种基于BEAM虚拟机(由Erlang提供)的函数式编程语言,以其并发性、分布式能力和容错性而闻名。它具有简洁的语法和强大的元编程特性,适合构建高可用性和可扩展性的系统。`elixir_google_spreadsheets` 将...

    ignite_repo:火箭座-点燃-长生不老药-挑战11-用Phoenix和Tesla制造的回购读取器后端

    安装Erlang , Elixir和Phoenix 。 重击命令 # Create phoenix app without webpacker or html views $ mix phx.new app_name --no-webpack --no-html # Intall dependencies $ mix deps.get # Compile project $ ...

    成像器:图像处理代理

    3. 配置文件:可能有`config`目录,其中的`config.exs`或`config/dev.exs`等文件用于设置应用程序的环境变量和配置。 4. 代理服务器模块:可能命名为`Imager.Proxy`或类似,这个模块会处理HTTP请求,调用ImageMagick...

    引导程序:逐步引导Elixir应用程序(受RabbitMQ启发)

    `lib`中的`*.ex`文件定义了应用的主要模块,而`config`目录下的配置文件用于设置应用的环境变量和启动参数。 2. **应用元数据**: 每个Elixir应用都有一个名为`mix.exs`的文件,其中包含了关于应用的信息,如名称...

    符合:用于发布的简单,强大且可扩展的配置工具

    由于Conform的配置文件是基于EEx(Elixir的嵌入式Erlang)模板,它可以生成多种格式的配置文件,如JSON、YAML等。这使得非Elixir项目也能利用Conform的特性。 8. **扩展性** Conform的设计考虑了可扩展性。你可以...

    etso:Ecto 3适配器允许使用ETS表中保存的Ecto模式

    2. **配置**:在配置文件`config/config.exs`中,设置`etso`为Ecto仓库的适配器。 3. **创建模式**:定义Ecto模式,然后告诉`etso`如何使用这些模式。模式需要继承`Ecto.Schema`并指定`use Etso.Schema`。 4. **...

    freshcom:Elixir中的快速,可扩展和可扩展的电子商务后端

    Elixir是一种运行在Erlang虚拟机上的函数式、并发、面向进程的编程语言,因其强大的性能和容错能力,常用于构建高可用性系统。 **Elixir的优势** Elixir以其轻量级进程和分布式特性而闻名,使得它在处理大量并发...

    集成了MQTT插件的jmeter3.1

    结合定时器控制并发用户数量和间隔,使用CSV Data Set Config读取多组连接参数,实现大规模并发测试。使用监听器收集和分析测试结果,例如聚合报告、视图结果树等,以便评估MQTT服务器的性能。 **六、应用示例** 1...

    events_spa:事件管理器重新实现为单页应用程序

    Elixir是一种函数式编程语言,以其并发性能和构建分布式系统的强大能力而闻名,它使用Erlang虚拟机(BEAM),为Web应用提供了高可用性和容错性。 项目的核心是使用Phoenix框架,这是Elixir社区广泛采用的用于构建...

    kafka_ex:Elixir的Kafka客户端库

    Elixir是一种基于BEAM虚拟机(Erlang虚拟机)的函数式编程语言,以其并发性、容错性和可扩展性而闻名。`kafka_ex`库是Elixir社区为连接到Apache Kafka而开发的,它提供了简单且高效的API,使开发者能够轻松地在...

Global site tag (gtag.js) - Google Analytics