如何使用PHP选择2TB JSON文件的最后100个元素

如何使用PHP选择2TB JSON文件的最后100个元素,php,json,Php,Json,我有一个巨大的JSON文件,每分钟都在增长。如果在最后使用\n添加每个数据,那么在SO中使用许多上选答案将非常容易读取文件。但是,我的JSON文件没有行尾字符,数据存储方式如下: [{a:1,b:"test{}ing"},{a:4,b:"aga,in"},{a:6,b:"another test with \" character"},...] 例如,我想读取此文件的最后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是什么以及它所解决的问题

关于哪些数据库可能擅长这样做,本文进行了各种讨论

看一看postgres vs mongo,这是两种可能的选择

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

您可以尝试使用
file\u get\u contents
提取最后10KB(假设最后10KB将包含您需要的100个元素-相应调整)

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

$regex=
\({元素的形状}){100}$\


用正则表达式替换元素的形状,正则表达式将恰好匹配数据集中的一个元素。然后它应该返回最后的100,因为我们使用美元来匹配字符串的结尾,只需确保根据您的字符串类型(例如多行等)使用正确的正则表达式选项即可。

只需确认,这是JSON还是CSV,在meWell看来,它很像JSON如果它是JSON,那么你可以将它从JSON解析为PHP对象,然后因为它本质上是一个数组,你可以使用PHP数组函数来选择数组中的最后100个元素,就像你选择任何其他数组一样?@MaxCarroll我很惊讶,我写的CSV实际上是指JSON!对不起,我真的很累。另外,我不能用PHP解析整个文件,因为没有足够的可用内存,文件几乎有2 TB。我只需要读取最后100{}个元素。使用JSON decode将JSON字符串转换为PHP对象,我猜这将是一个数组,因为它看起来是顶级数组,那么看起来您可以切片数组以再次获取最后100个项目请检查此点我不是PHP专家,这些只是许多编程语言中可用的概念,
$arrayObject=json\u decode($jsonString)
这一行对我来说不起作用。字符串
$jsonString
将非常大(2TB),我将永远无法拥有一台具有2TB RAM的计算机/机器来将内容保存到内存中。嗯,所以文件太大,无法加载到内存中。也许您可以使用streamreader从文件末尾向后读取,并使用某种正则表达式来计算它迭代了多少个元素?或者可能不将这些内容写入文件,而是使用数据库。由于索引、类型等原因,2TB的原始内容变得更像10TB的磁盘存储,数据库性能将非常糟糕。。。我不知道如何搜索谷歌再寻找这个答案!如果您真的必须选择文件的最后100个元素,我会猜它是多少字节,然后可能添加一些意外情况,使用流读取器从文件末尾读取那么多字节,并使用正则表达式将其提取出来。