新手问题 更新元素的比较问题

Kirisames · 2021年07月22日 · 最后由 mizuhashi 回复于 2021年07月23日 · 468 次阅读

场景

运维现在需要测定数据库的更新频率,数据使用爬虫爬取。

返回两个 JSON 文件,代表着一个月前的数据和现在的数据。
例子:

// a month ago
{"id":  "111","name":  "kirisame", "age": 16, "info": "I like Mushroom"}
{"id":  "222","name":  "reimu", "age": 16, "info": "I like Sleep"}
{"id":  "333","name":  "Scarlet", "age": 300, "info": "I don't like sunshine"}
{"id":  "111","name":  "kirisame", "age": 16, "info": "I like Mushroom and fireworks"}
{"id":  "222","name":  "reimu", "age": 16, "info": "I like Sleep and money"}
{"id":  "333","name":  "Scarlet", "age": 300, "info": "I don't like sunshine"}

目前需要统计有多少个条目是和之前不同的,以此确定更新频率

想法

分别读入两个文件,并用数组存储

  1. 循环某一个数组(假设循环现在的数组),然后每条去另一个数组(一个月前的数组)查找修改情况。不过这种数组查询应该不行,效率太低了。
  2. 两个数组都按照 id 字段排序,然后使用循环查看对应情况。不过这样需要注意条目的增加,需要一些判断条件。
  3. 把这些数组转换成 hash,使用 id 做 key,字段为 value。这个方法有什么好一些的写法吗?
    我目前的想法:
def conver_array_hash(input_array)
    hash = {}
    input_array.each do |element|
        hash[element[:id].to_sym] = element.except(:id)
    end
    hash
end

如果有更好的解决方法,欢迎大家一起讨论。

set_new - set_old

这得看数据量大小吧,如果是一百万数据,hash 建表得花不少时间吧

可以考虑命令行处理,通过 comm 工具获取两个文件不同的行:

  • comm -3 -2 <(sort file1) <(sort file2) 是 file1 有,file2 没有
  • comm -3 -1 <(sort file1) <(sort file2) 是 file2 有,file1 没有
spike76 回复

哦哦,这个方法不错。

andrew_zyl 回复

目前有 2-3w 条。 数据如果多了的话,建表确实要花很多的时间。所以也想交流一下有没有更好的方法。

zhengpd 回复

学习了。原来还有这种命令。

雾雨 灵梦 斯卡雷特

需要 登录 后方可回复, 如果你还没有账号请 注册新账号