将数组追加到现有的json文件,而不加载和解码hole文件


Append array to existing json file without loading and decoding the hole file

我正在使用php创建一个txt文件导入器,它在不久的将来可能会相当大,达到约150MB,我所做的是将导入过程分成几个步骤,其中一个步骤是从txt中提取的数据保存到一个新的json文件中。我想做的是在每个循环中附加一个新的json编码数组到这个文件,避免在80MB处理后有一个非常大的数组,并一次保存一切,谁能告诉我如何插入一个新的json编码数组到现有的json文件中,而不加载孔文件,解码它插入到数组并再次编码?这可以在我的导入器中节省很多资源,我已经搜索了整个网站,但没有找到这样的东西。

正如One Trick Pony所说,您应该为此使用数据库。如果您不想在配置上添乱,SQLite是一个不错的选择。这么说,我看到了实现这一目标的另一种方式。前提是你安装的PHP可以运行shell_exec,并且你想修改的结构不是嵌套很深的,例如,在

中添加顶级键。
{
   "key0": {
             "value": { ... }
             "value": { ... }
           }
   "key1": { ... }
}

,然后你可以使用shell exec删除.json文件的最后一行(})

shell_exec('sed $d /path/to/file.json');

然后将下一个键存储在一个变量中,作为原始JSON,不带左花括号(但保留闭括号):

$json = <<<EOT
"key2": {
          "value": {...}
        }
}
EOT;

并将其附加到JSON文件的末尾:

shell_exec("$json >> /path/to/file.json");

如果你真的在优化资源,你不应该使用EOT并将其作为一个平面字符串输入,这适用于你的整个文件:那些换行符必须被存储。

然而,所有这些都是一个非常黑客的解决方案,如果可能的话,您应该使用数据库。打开SQLite数据库会导致将所有内容加载到内存中,因此从资源消耗的角度来看可能对您没有帮助。

硬件很便宜,到处搜索,我相信你会找到一些主机可以处理这个任务,而且不会超出你的预算——你可以用每月不到10英镑的价格获得专用服务器,或者你可以启动一个Amazon EC2实例,只是为了时不时地运行这个任务,把它转储回你的服务器(或S3),然后停止运行。这几乎不需要花费什么。

总有一天,当你的数据库太大,SQLite是一个低效的解决方案(因为整个东西都加载到内存中),在这种情况下,你应该去一个合适的数据库,如MySQL/PostgreSQL/…它可以在相对有限的资源上处理庞大的数据库