Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.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
Php 操作大型json对象的最佳方法_Php_Mysql_Json - Fatal编程技术网

Php 操作大型json对象的最佳方法

Php 操作大型json对象的最佳方法,php,mysql,json,Php,Mysql,Json,我们有一个应用程序,它每4小时调用一个API,并获取所有对象的转储,以json格式返回,然后存储在file.json中 我们这样做的原因是因为我们需要最新的数据,我们不允许直接使用api来获取这些数据的一小部分,我们还需要对其进行清理 还有一个问题,我们不能只要求更新记录(这实际上是我们需要的) 我们目前处理这个问题的方法是获取数据,存储在一个文件中,将以前的文件加载到内存中,并比较值,以便只获取新的和更新的值,一旦获得新的和更新的值,我们就继续插入MySQL 我目前正在研究一个不同的选项,我想

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

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

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

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

我目前正在研究一个不同的选项,我想的是,既然新文件将包含每个记录,为什么不在需要时从file.json查询所需的对象呢


问题是,其中一些文件的大小超过50MB(每个文件包含一个相关表,总共有6个文件完成了完整的关系),我们不能每次查询时都将它们加载到内存中,有人知道DB系统可以查询文件吗?或者有一种更简单的方法可以通过快速操作将旧数据替换为新数据?

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

下面是我如何尝试实现这一点的,我曾在一个Web应用程序上工作过,该应用程序使用类似的方法在磁盘上搜索XML文件,而不是数据库(而且,值得注意的是,对于生产使用来说,仍然足够快):

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

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

    流式JSON解析器很少见,但它们确实存在。已经创造了

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

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

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

    将其与索引文件的使用相结合,特别是如果它们是以树而不是列表的形式生成的,可能会使您从一个简单的、纯粹基于文件系统的解决方案中获得最佳性能


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

下面是我如何尝试实现这一点的,我曾在一个Web应用程序上工作过,该应用程序使用类似的方法在磁盘上搜索XML文件,而不是数据库(而且,值得注意的是,对于生产使用来说,仍然足够快):