我正在使用 php 创建一个 txt 文件导入器,在不久的将来可能会达到 150MB 左右,我所做的是将导入过程分成几个步骤,其中一个保存从txt 到一个新的 json 文件。我喜欢做的是在每个循环中将一个新的 json 编码数组附加到这个文件中,避免在处理 80MB 后有一个非常大的数组并立即保存所有内容,谁能告诉我如何将一个新的 json 编码数组插入到现有的 json 文件中不加载孔文件,将其解码插入数组并再次编码?这可以在我的 inporter 中节省大量资源,我已经搜索了该网站,但没有找到类似的东西。
1 回答
正如 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
并将其作为平面字符串输入,那么这适用于您的整个文件:必须存储这些换行符。
然而,所有这些都是一个非常hacky的解决方案,如果可能的话,你应该使用数据库。打开 SQLite 数据库会导致整个内容加载到内存中,因此从资源消耗的角度来看可能对您没有帮助。
硬件很便宜,四处搜索,我相信你会找到一些可以处理这项工作并且不会超出预算的主机——这些天你可以获得每月不到 10 英镑的专用服务器,或者你可以启动亚马逊EC2 实例只是为了不时地运行此作业,将其转储回您的服务器(或 S3),然后减速。它几乎不花任何钱。
有时你的数据库太大了,以至于 SQLite 是一个低效的解决方案(因为整个东西都加载到内存中),在这种情况下,你应该选择一个合适的数据库,比如 MySQL/PostgreSQL/... 可以处理巨大的资源相对有限的数据库。