【问题标题】:Exporting database to JSON using Laravel exceeds memory limit使用 Laravel 将数据库导出为 JSON 超出内存限制
【发布时间】:2021-04-13 13:34:04
【问题描述】:

我有一个 Laravel 应用程序,其基础数据库具有长序列。我想为用户提供以 JSON 格式下载数据库的机会。为此,我首先获取记录,然后将它们转换为 JSON 格式并写入文件。 但是,当我将应用程序移至生产服务器时,它给了我

You don't have permission to access /saveJson on this server.

从日志中,是错误消息:

[2021-01-07 19:08:50] local.ERROR: Allowed memory size of 1887436800 bytes exhausted (tried to allocate 675803754 bytes) {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Allowed memory size of 1887436800 bytes exhausted (tried to allocate 675803754 bytes) at /home/xxx/vendor/league/flysystem/src/Util/MimeType.php:205)
[stacktrace]

服务器中的memory_limit已经设置为-1,设置后重启。

代码的相关部分:

    DB::connection()->disableQueryLog();
    $large_db = Model::with('regions', 'genes.gene_models.aro_categories')
        ->where('curated', '<>', 4)
        ->get();
    $db_JSON = $large_db->toJSON();
    Storage::disk('public')->put("database_$date.json", $db_JSON);
    DB::connection()->enableQueryLog();

根据 MySQL,整个数据库大约 170M,根据 meminfo,服务器有 1962MB 内存,所以我不完全明白为什么它不能加载记录 - 虽然因为数据库要更新,所以我想创建在某种程度上它也不会因为类似的原因而崩溃。

有没有更聪明的方法在不超过内存限制的情况下导出数据库?某种缓冲?

感谢您的任何建议!

【问题讨论】:

    标签: database laravel memory memory-limit


    【解决方案1】:

    toJSON() 将模型转换为数组,然后使用 PHP 原生的json_encode() 将数据转换为 json。 Laravel Docs.

    This answer 给出了使用json_encode()json_decode() 在 PHP 数组和 JSON 之间移动的内存效率估计值。在应答器的计算中,PHP 数组消耗的内存大约是 JSON 序列化数据的 9 倍。

    对这个问题采取一种天真的方法,我们可以假设我们需要大约 10 倍于生成的 JSON 文件大小的内存才能将数据转储到文件中(如果我们通过 PHP 数组)。

    170MiB x 10 非常接近您的内存限制。包括 Laravel 对象中的额外内存开销,您正在耗尽所有可用内存是有道理的。

    最好的选择是想出某种选项来转储数据库,从而跳过将其加载到 PHP 对象中。我建议编写一个 MySQL 查询,将 JSON 直接写入文件,然后返回生成的 JSON 文件。

    【讨论】:

    • 我希望加载记录的内存和开销内存,但不是 10 倍...哇...谢谢您的回答!
    • 是的,很令人惊讶,对吧?如果我处于你的位置,我可能会使用mysqldump 转储数据库并将其作为.sql 提供给用户
    • 考虑写入 CSV(逗号分隔变量)数据以避免巨大的 RAM 需求。
    • 我最终从 JSON 数据中删除了大序列并仅将它们作为 FASTA 文件提供。谢谢你们!
    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多