Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 解析100mb JSON负载的有效方法_Ruby_Json_Amazon Web Services - Fatal编程技术网

Ruby 解析100mb JSON负载的有效方法

Ruby 解析100mb JSON负载的有效方法,ruby,json,amazon-web-services,Ruby,Json,Amazon Web Services,我每12小时在AmazonEC2微实例上运行一次cron作业。它下载118MB的文件,并使用json库对其进行解析。这当然会导致实例内存不足。我的实例有416MB的可用内存,但我运行脚本时,它会下降到6MB,然后被操作系统杀死 我想知道我的选择是什么?有没有可能通过Ruby高效地解析这个问题,或者我必须使用像C这样的低级语言?我可以得到一个功能更强大的amazon实例,但我真的想知道是否可以通过Ruby实现这一点 更新: 我已经看过yajl了。它可以在解析时为您提供json对象,但问题是,如果您

我每12小时在AmazonEC2微实例上运行一次cron作业。它下载118MB的文件,并使用json库对其进行解析。这当然会导致实例内存不足。我的实例有416MB的可用内存,但我运行脚本时,它会下降到6MB,然后被操作系统杀死

我想知道我的选择是什么?有没有可能通过Ruby高效地解析这个问题,或者我必须使用像C这样的低级语言?我可以得到一个功能更强大的amazon实例,但我真的想知道是否可以通过Ruby实现这一点

更新: 我已经看过yajl了。它可以在解析时为您提供json对象,但问题是,如果您的json文件只包含1个根对象,那么它将被迫解析所有文件。我的JSON如下所示:

--Root
   -Obj 1
   -Obj 2
   -Obj 3
因此,如果我这样做:

parser.parse(file) do |hash|
  #do something here
end
因为我只有一个根对象,所以它将解析整个JSON。如果obj1/2/3是root,那么它会工作,因为它会一个接一个地给我它们,但我的JSON不是这样的,它解析并消耗500 MB的内存

更新#2: 下面是大118mb文件(7mb)的较小版本:

消失

它是可解析的,我并没有从文件中删除一些字节,只是为了让您能够看到它的整体。我要找的阵列是这样的

events = json['resultsPage']['results']['event']
谢谢

实现了一个流解析器。您可以使用它动态读取JSON,这样您就可以在内容进入时对其进行操作,然后在处理完内容后丢弃它们(以及由此生成的数据结构)。如果你很聪明的话,这会让你的记忆力受到限制

编辑:对于您的数据,您真正感兴趣的是一次提取JSON对象的一部分,而不是解析整个对象。这要复杂得多,实际上需要实现自己的解析器。它的螺母和螺栓是您想要的:

  • 进入事件数组
  • 对于数组中的每个事件,分析事件
  • 将解析后的事件传递给某个回调函数
  • 放弃已解析的事件和源输入,以便为下一个事件释放内存
  • 这对yajl不起作用,因为这里处理的是一个对象,而不是多个对象。要使其与yajl一起工作,您需要手动解析JSON以发现事件对象边界,然后将每个事件对象块传递给JSON解析器进行反序列化。像Ragel这样的东西可以简化这个过程


    当然,只升级AWS实例会更容易。

    类似的东西可以将json解析为流

    是否可以将下载分成6个或更多段,然后将它们放回一起?100 MB的json文本?你在储存什么?亚历山大图书馆<代码>:P为什么要使用JSON来实现此目的?听起来不适合这份工作。更面向记录的东西(甚至CSV)将是更好的匹配。如果您无法控制格式,那么您可以手动剥离根对象,强制将格式转换为面向记录的JSON。该文件出现403权限错误。抱歉,我不知道任何事情。我会手工完成,然后和那些认为120MB JSON是个好主意的人说几句话。考虑到基于SAX的解析器的普遍性,XML将是一个更明智的选择。您可以使用sed或其他方法预解析JSON,以剥离根对象,并用括号替换它,从而为您留下一个要操作的对象数组,而不是包含一组数组的对象。如果您能提供对象的前500字节,我们可能能够提供更具体的帮助。我已经更新了我的答案,现在我们已经查看了示例数据。谢谢,感谢您的详细回复。我想我必须更新我的aws实例。