php - 如何使用 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 内容仍然不完整/格式错误,我怎么知道我可以解析它?
解决方案
我认为这是文档存储没有 sql 数据库的完美用例,例如用于存储检索和操作大量 JSON 数据的 mongo db。
请使用合适的解决方案(例如 nosql 数据库和文档存储)来操作和访问大量数据,而不是将其存储在文本文件中。
以下是一些阅读材料的链接
这一篇很好地解释了 NOSQL 是什么以及它解决的问题
这个有各种关于哪些数据库可能擅长这样做的讨论
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,因为我们使用美元来匹配字符串的结尾,只要确保您使用正确的正则表达式选项,具体取决于您的字符串类型(例如多行等...)
推荐阅读
- php - 有没有办法在 php 变量中添加带有 ids/classes 样式的 html?
- django - django:尝试导入网址时找不到应用程序
- objective-c - 如何将 3rd 方 Obj-C 框架导入我自己的 Swift 框架
- javascript - 将锚的 src 属性值传递给 CF7 的字段
- android - GSON - 使用映射将 JsonObject 转换为 java/Kotlin 对象
- reactjs - 具有“静默”本地 Active Directory 身份验证的 ReactJS 和 .Net Core 应用程序
- sql - UPDATE 中不允许修复 set-returning 函数
- mongodb - 用于嵌入式集合的 MongoDB $lookup
- php - 将 PayStack paymentDetails 数组保存到 laravel 订单表
- dotspatial - 如何从 DemoMap DotSpatial 程序中的插件访问地图控件