操纵大型json对象的最佳方法

时间:2017-01-15 00:02:53

标签: php mysql json

我们有一个应用程序每隔4小时调用一次API并获取所有对象的转储,以json格式返回,然后存储在file.json中

我们这样做的原因是因为我们需要最新数据,我们不允许直接使用api来获取这些数据的一小部分,而且还需要对其进行清理。

还有另一个问题,我们不能只调用更新的记录(这实际上是我们需要的)

我们目前处理这种方式的方法是获取数据,存储在文件中,将先前的文件加载到内存中并比较这些值,以便只获取新的和更新的文件,一旦我们获得新的和更新的我们继续并插入MySQL

我目前正在寻找一个不同的选项,我想的是,因为新文件将包含每一条记录,为什么不在需要时从file.json查询所需的对象?

问题在于其中一些文件大于50MB(每个文件包含一个相关的表,共有6个文件,完成了完整的关系),我们每次都无法将它们加载到内存中有一个查询,是否有任何人知道数据库系统将允许查询文件或更简单的方法用快速操作替换旧数据?

2 个答案:

答案 0 :(得分:2)

我认为您已经使用的方法可能是最实用的,但我对您直接搜索JSON文件的想法很感兴趣。

以下是我实现这一点的方法,我曾经使用过一种Web应用程序,该应用程序使用类似的方法在磁盘而不是数据库上搜索XML文件(显然,对于生产使用来说仍然足够快) :

  • 首先对JSON数据进行排序。创建一个新的主文件,其中的对象重新排序以匹配它们在数据库中的索引方式,这将最大限度地提高线性搜索数据的效率。

  • 使用流式JSON解析器进行搜索。这将允许逐个对象地解析文件,而无需先将整个文档加载到内存中。如果文件已排序,则每次查找只需要解析文档的一半。

    流式JSON解析器很少见,但它们存在。 Salsify创建了one for PHP

  • 使用以上两种策略直接搜索文件。您可能会发现这足以使应用程序可用,特别是如果它只支持少量用户。如果不是:

  • 在磁盘上构建单独的索引。不要让应用程序直接搜索整个JSON文件,而是在收到它时解析一次,并创建一个或多个将键值与字节关联的索引文件偏移到原始文件中。然后,应用程序可以搜索(小得多)索引文件以获取所需的对象;一旦它检索到匹配的偏移量,它就可以立即寻找主文件中相应的JSON对象并直接解析它。

  • 考虑使用更高效的数据格式。 JSON是轻量级的,但可能有更好的选择。你可以尝试一下 使用serialize生成新的主文件,以PHP的本机序列化格式输出每个解析的JSON对象的“冻结”表示。然后,应用程序可以使用unserialize来获取它可以立即使用的数组或对象。

    将此与索引文件的使用相结合,特别是如果它们是作为树而不是列表生成的,可能会从简单的纯文件系统解决方案中为您提供最佳性能。

答案 1 :(得分:0)

我最终做了自己的处理方法。

我得到了所有记录的json转储,然后我将其处理成单个文件,每个文件都包含其中的所有相关记录,有点像连接,以避免将这些文件编入索引很长时间我创建了多个子文件夹一块记录,在创建这些文件时,我开始构建一个索引文件,指向记录的目录位置,这是一个很小的文件,现在每次有查询我只是将索引文件加载到1 MB以下的内存中然后我检查索引键是否存在,这是记录的主密钥,如果是,那么我将获得该文件的位置,然后我将其加载到内存中并具有在应用程序中使用的所有必需信息。

这些文件的查询最终比查询适合我们需要的数据库快得多。

感谢大家的意见,因为它帮助我决定走哪条路。