免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2391 | 回复: 3
打印 上一主题 下一主题

[函数] 【mnesia】分片 [复制链接]

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-03 23:01 |只看该作者 |倒序浏览
在其它数据库里也有分片的概念,原因是有大表,我这里有一个例子,数据是全球ip地址信息到城市,数据大约是460万,全load到内存我的笔记本6G,撑不住。用了分片(10)后,内存也占用不少,但是不至于load不起来。

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
2 [报告]
发表于 2015-02-03 23:01 |只看该作者
  1. -module(location).
  2. -include_lib("include/location.hrl").
  3. -include_lib("stdlib/include/qlc.hrl").
  4. -compile(export_all).

  5. read_txt() ->
  6.     {ok, M} = file:open("dbip-city.csv", [binary, read]),
  7.     read_line(M).

  8. read_line(M) ->
  9.     case file:read_line(M) of
  10.       {ok, L} -> i(L), read_line(M);
  11.       {eof} -> ok, file:close(M)
  12.     end.

  13. i(S) ->
  14.     Slash = binary:replace(S, <<"\"">>, <<>>, [global]),
  15.     T = erlang:binary_to_list(Slash),
  16.     R = string:tokens(T, "\n"),
  17.     spawn(fun () -> insert_data(R) end).

  18. insert_data(L) ->
  19.     case string:tokens(lists:flatten(L), ",") of
  20.       [Ip, Mask, Country, Area0, Area1, Area2] ->
  21.           Row = #location{ip = Ip, mask = Mask, country = Country,
  22.                           area = Area0, city = lists:concat([Area1, Area2])};
  23.       [Ip, Mask, Country, Area, City] ->
  24.           Row = #location{ip = Ip, mask = Mask, country = Country,
  25.                           area = Area, city = City};
  26.       [Ip, Mask, Country, Area] ->
  27.           Row = #location{ip = Ip, mask = Mask, country = Country,
  28.                           area = Area};
  29.       [Ip, Mask, Country] ->
  30.           Row = #location{ip = Ip, mask = Mask, country = Country}
  31.     end,
  32.     db_dirty_write(Row).

  33. init_table() ->
  34.     mnesia:start(),
  35.     mnesia:delete_table(location),
  36.     mnesia:create_table(location,
  37.                         [{attributes, record_info(fields, location)},
  38.                          {disc_only_copies, [node()]}]),
  39.     mnesia:change_config(extra_db_nodes, [b]),
  40.     mnesia:add_table_copy(location, nodes(),
  41.                           disc_only_copies),
  42.     read_txt().

  43. address(Ip) ->
  44.     MatchHead = #location{ip = '$4', mask = '$5',
  45.                           country = '$1', area = '$2', city = '$3'},
  46.     Guard = [{'>=', '$4', Ip}, {'=<', '$5', Ip}],
  47.     Result = ['$4', '$5', '$1', '$2', '$3'],
  48.     MatchSpec = [{MatchHead, Guard, Result}],
  49.     SelFun = fun () ->
  50.                      mnesia:select(location, MatchSpec, 10, read)
  51.              end,
  52.     mnesia:activity(transaction, SelFun, [], mnesia_frag).

  53. query(Ip) ->
  54.     Query = fun () ->
  55.                     Q = qlc:q([E
  56.                                || E <- mnesia:table(location),
  57.                                   E#location.ip =< Ip]),
  58.                     Sort = qlc:e(qlc:keysort(2, Q, [{order, descending}])),
  59.                     QC = qlc:cursor(Sort),
  60.                     qlc:next_answers(QC, 1)
  61.             end,
  62.     {atomic, Results} = mnesia:transaction(Query),
  63.     Results.

  64. q(Ip) ->
  65.     Query = fun () ->
  66.                     qlc:eval(qlc:q([[E#location.ip, E#location.mask,
  67.                                      E#location.country, E#location.area,
  68.                                      E#location.city]
  69.                                     || E <- mnesia:table(location),
  70.                                        (Ip =< E#location.mask) and
  71.                                          (E#location.ip =< Ip)]))
  72.             end,
  73.     {atomic, Results} = mnesia:transaction(Query),
  74.     Results.

  75. q1() -> mnesia:dirty_read({location, "195.101.114.0"}).

  76. q2() ->
  77.     mnesia:match_object({location, "195.101.114.0"}).

  78. db() ->
  79.     mnesia:create_table(location,
  80.                         [{frag_properties,
  81.                           [{n_fragments, 20}, {n_disc_copies, 1},
  82.                            {node_pool, [node()]}]},
  83.                          %{index, [ip, mask, country,area]},
  84.                          {attributes, record_info(fields, location)}]).

  85. db_dirty_write(Row) ->
  86.     AddFun = fun () -> mnesia:write(location, Row, write)
  87.              end,
  88.     ok = mnesia:activity(async_dirty, AddFun, [],
  89.                          mnesia_frag).
复制代码

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
3 [报告]
发表于 2015-02-03 23:02 |只看该作者
用这种数据学习mnesia我觉得是个好的方法。

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
4 [报告]
发表于 2015-02-03 23:03 |只看该作者
你可以下载到数据 https://db-ip.com/db/#php 第二列IP address to city (low resolution)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP