首页 > 解决方案 > 如何使用 PHP 选择 2TB JSON 文件的最后 100 个元素

问题描述

我有一个巨大的 JSON 文件,每分钟都在增长。如果最后添加了每个数据\n,那么在 SO 中使用许多赞成的答案来阅读文件将非常容易。但是,我的 JSON 文件没有行尾字符,数据存储如下:

[{a:1,b:"test{}ing"},{a:4,b:"aga,in"},{a:6,b:"another test with \" character"},...]

例如,我想读取{}此文件的最后 100 个条目(始终附加到文件中),并且在读取时,我想检查该a值是否大于指定数字或达到 100条目,停止读取文件并输出 json 对象。

如何使用 PHP 做到这一点?我的意思是,如何读取文件末尾的内容,并在读取时解析内容的 JSON。我不知道该怎么做,因为如果 JSON 内容仍然不完整/格式错误,我怎么知道我可以解析它?

标签: phpjson

解决方案


我认为这是文档存储没有 sql 数据库的完美用例,例如用于存储检索和操作大量 JSON 数据的 mongo db。

请使用合适的解决方案(例如 nosql 数据库和文档存储)来操作和访问大量数据,而不是将其存储在文本文件中。

以下是一些阅读材料的链接

https://medium.com/cracking-the-data-science-interview/an-introduction-to-big-data-nosql-96b882f35e50

这一篇很好地解释了 NOSQL 是什么以及它解决的问题

哪个数据库适合存储大型 JSON?

这个有各种关于哪些数据库可能擅长这样做的讨论

https://www.sisense.com/en-gb/blog/postgres-vs-mongodb-for-storing-json-data/

看一下 postgres 与 mongo,这是您有两个可能的选择。

如果您确实必须继续使用文本文件来写入 2TB 的 JSON 数据,那么您可以流出文件的末尾并使用正则表达式进行匹配。

您可以尝试使用file_get_contents https://www.php.net/manual/en/function.file-get-contents.php来提取最后 10KB(假设最后 10KB 肯定会包含您需要的 100 个元素 - 相应调整)

$section = file_get_contents('./2TBFile.JSON', FALSE, NULL, $SizeOfFile - 10000, 10000);

$正则表达式 =\({Shape Of An Element}){100}$\

用正则表达式替换元素的形状,该正则表达式将与数据集中的一个元素完全匹配。然后它应该返回最后的 100,因为我们使用美元来匹配字符串的结尾,只要确保您使用正确的正则表达式选项,具体取决于您的字符串类型(例如多行等...)


推荐阅读