php加载一次大json文件

php加载一次大json文件,php,json,Php,Json,我创建了一个本地web应用程序来显示数据并与之交互,我得到了一个大的Json文件(大约250个月)。为了以不同的方式显示数据,我有几个函数,但目前每个函数都是从读取和解析Json文件开始的: $string = file_get_contents("myFile.json"); $json_a = json_decode($string, true); 问题是它非常慢(大约4秒),因为文件很大。。。因此,我想一次性解析Json文件,并将解析后的数据存储在内存中,以便每个函数都可以使用它: se

我创建了一个本地web应用程序来显示数据并与之交互,我得到了一个大的Json文件(大约250个月)。为了以不同的方式显示数据,我有几个函数,但目前每个函数都是从读取和解析Json文件开始的:

$string = file_get_contents("myFile.json");
$json_a = json_decode($string, true);
问题是它非常慢(大约4秒),因为文件很大。。。因此,我想一次性解析Json文件,并将解析后的数据存储在内存中,以便每个函数都可以使用它:

session_start();
$string = file_get_contents("myFile.json");
$_SESSION['json_a'] = json_decode($string, true);
然后在我的函数中使用
$\u SESSION['json\u a']
。 但是当函数访问这个
$\u会话['json\u a']
变量时,我遇到了一个错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 195799278 bytes)
我想是因为文件太大了。。但是为什么它在使用变量时崩溃,而不是在构建变量时崩溃?如果我的第一个解决方案(每次解析)对于内存来说太大,为什么我可以这样做呢


最后,我真正的问题是:我如何优化这一点?(我知道sql数据库会更好,但我碰巧有json数据)

您可能需要一个流式解析器。可能有一种方法可以使用较小的数据块加载此数据,但我不确定您将如何执行此操作。就我个人而言,我会看一看这个文件,看看是否有我可以把它分解成更小的部分。此外,我不会将其加载到会话中,会话从来就不应该包含这么多数据。一旦你将数据分解成更小的片段,我会考虑使用APC或memcache,因为这样保存此类数据会更好,你也可以打开文件并查找到需要的位置,而不是将其全部读取到内存中。保存会话时会序列化,这与你现在遇到的问题相同。这也是一个可怕的很多保存。您应该对其进行解析,然后将其放入数据库(如果只使用一次,则为临时表)。最终,内存中会有大约3个数据副本:原始json版本、从json_decode创建/返回的解码版本,以及您试图填充到$_会话中的副本。