Php 操作大型json对象的最佳方法
我们有一个应用程序,它每4小时调用一个API,并获取所有对象的转储,以json格式返回,然后存储在file.json中 我们这样做的原因是因为我们需要最新的数据,我们不允许直接使用api来获取这些数据的一小部分,我们还需要对其进行清理 还有一个问题,我们不能只要求更新记录(这实际上是我们需要的) 我们目前处理这个问题的方法是获取数据,存储在一个文件中,将以前的文件加载到内存中,并比较值,以便只获取新的和更新的值,一旦获得新的和更新的值,我们就继续插入MySQL 我目前正在研究一个不同的选项,我想的是,既然新文件将包含每个记录,为什么不在需要时从file.json查询所需的对象呢Php 操作大型json对象的最佳方法,php,mysql,json,Php,Mysql,Json,我们有一个应用程序,它每4小时调用一个API,并获取所有对象的转储,以json格式返回,然后存储在file.json中 我们这样做的原因是因为我们需要最新的数据,我们不允许直接使用api来获取这些数据的一小部分,我们还需要对其进行清理 还有一个问题,我们不能只要求更新记录(这实际上是我们需要的) 我们目前处理这个问题的方法是获取数据,存储在一个文件中,将以前的文件加载到内存中,并比较值,以便只获取新的和更新的值,一旦获得新的和更新的值,我们就继续插入MySQL 我目前正在研究一个不同的选项,我想
问题是,其中一些文件的大小超过50MB(每个文件包含一个相关表,总共有6个文件完成了完整的关系),我们不能每次查询时都将它们加载到内存中,有人知道DB系统可以查询文件吗?或者有一种更简单的方法可以通过快速操作将旧数据替换为新数据?我认为您现在使用的方法可能是最实用的,但我对您直接搜索JSON文件的想法很感兴趣 下面是我如何尝试实现这一点的,我曾在一个Web应用程序上工作过,该应用程序使用类似的方法在磁盘上搜索XML文件,而不是数据库(而且,值得注意的是,对于生产使用来说,仍然足够快):
- 首先对JSON数据进行排序。创建一个新的主文件,对对象进行重新排序,以匹配它们在数据库中的索引方式,这将最大限度地提高通过数据进行线性搜索的效率
- 使用流式JSON解析器进行搜索。这将允许逐个对象解析文件,而无需先在内存中加载整个文档。如果对文件进行了排序,则每次查找平均只需要解析一半的文档 流式JSON解析器很少见,但它们确实存在。已经创造了
- 使用上述两种策略直接搜索文件。您可能会发现这足以使应用程序可用,特别是当它只支持少量用户时。如果没有:
- 在磁盘上构建单独的索引。不要让应用程序直接搜索整个JSON文件,而是在接收到JSON文件时对其进行一次解析,并创建一个或多个索引文件,将键值与字节偏移量关联到原始文件中。然后,应用程序可以在一个(小得多的)索引文件中搜索它需要的对象;一旦检索到匹配的偏移量,它就可以立即查找主文件中相应的JSON对象并直接解析它
- 考虑使用更高效的数据格式。JSON是轻量级的,但可能有更好的选择。你可以尝试一下 生成一个新的主文件,使用以PHP本机序列化格式输出每个已解析JSON对象的“冻结”表示。然后,应用程序可以使用来获取它可以立即使用的数组或对象 将其与索引文件的使用相结合,特别是如果它们是以树而不是列表的形式生成的,可能会使您从一个简单的、纯粹基于文件系统的解决方案中获得最佳性能
- 首先对JSON数据进行排序。创建一个新的主文件,对对象进行重新排序,以匹配它们在数据库中的索引方式,这将最大限度地提高通过数据进行线性搜索的效率
- 使用流式JSON解析器进行搜索。这将允许逐个对象解析文件,而无需先在内存中加载整个文档。如果对文件进行了排序,则每次查找平均只需要解析一半的文档 流式JSON解析器很少见,但它们确实存在。已经创造了
- 使用上述两种策略直接搜索文件。您可能会发现这足以使应用程序可用,特别是当它只支持少量用户时。如果没有:
- 在磁盘上构建单独的索引。不要让应用程序直接搜索整个JSON文件,而是在接收到JSON文件时对其进行一次解析,并创建一个或多个索引文件,将键值与字节偏移量关联到原始文件中。然后,应用程序可以在一个(小得多的)索引文件中搜索它需要的对象;一旦检索到匹配的偏移量,它就可以立即查找主文件中相应的JSON对象并直接解析它
- 考虑使用更高效的数据格式。JSON是轻量级的,但可能有更好的选择。你可以尝试一下
生成一个新的主文件,使用以PHP本机序列化格式输出每个已解析JSON对象的“冻结”表示。然后,应用程序可以使用来获取它可以立即使用的数组或对象
将其与索引文件的使用相结合,特别是如果它们是以树而不是列表的形式生成的,可能会使您从一个简单的、纯粹基于文件系统的解决方案中获得最佳性能。