PHP Google Cloud Vision API:注释立即淹没内存

Posted

技术标签:

【中文标题】PHP Google Cloud Vision API:注释立即淹没内存【英文标题】:PHP Google Cloud Vision API : annotate instantly flood the memory 【发布时间】:2018-10-07 19:44:15 【问题描述】:

我使用云视觉用 DOCUMENT_TEXT_DETECTION 对文档进行注释,而且我只使用数据字样。

annotate 命令会为每个字母/符号(语言、顶点、中断、文本、置信度等)返回大量信息,这会增加大量内存使用。在 4 页文档上运行注释¹返回超过 100MB 的数据,这超出了我的 php 内存限制,导致脚本崩溃。仅获取单词数据可能会小 5 倍左右。

为了清楚起见,我加载 VisionClient,设置图像,运行 annotate() 命令,它直接返回一个 100MB 的变量,此时崩溃,在我有机会进行任何清理之前。

$vision = new VisionClient([/* key & id here */]);
$image = $vision->image(file_get_contents($imagepath), ['DOCUMENT_TEXT_DETECTION']);
$annotation = $vision->annotate($image); // Crash at that point trying to allocate too much memory.

有没有办法不请求全部数据? annotate 上的文档似乎表明可以仅对图片的一部分进行注释,但不能折腾符号数据。

在更基本的层面上,我在一般内存管理方面做错了吗?

谢谢

编辑:刚刚意识到:我还需要将数据存储在一个文件中,我使用 serialize()... 运行时内存使用量加倍,即使我执行 $annotation = serialize($annotation) 到避免有2个变量。所以我实际上每个用户需要 200MB。

¹尽管这与文本数量而不是页面数量有关。

【问题讨论】:

@LawrenceCherone 我计划让很多用户同时使用它,如果每个用户都需要 100MB,我认为这太多了。 【参考方案1】:

迪诺,

在处理大型图片时,我强烈建议您将图片上传到 Cloud Storage,然后针对存储桶中的图片运行注释请求。通过这种方式,您将能够利用存储库中可用的可恢复或流式协议来以更高的可靠性和更少的内存消耗上传您的对象。下面是使用可恢复上传器的快速 sn-p:

use Google\Cloud\Core\Exception\GoogleException;
use Google\Cloud\Storage\StorageClient;
use Google\Cloud\Vision\VisionClient;

$storage = new StorageClient();
$bucket = $storage->bucket('my-bucket');
$imageName = 'my-image.png';

$uploader = $bucket->getResumableUploader(
    fopen('/path/to/local/image.png', 'r'),
    [
        'name' => $imageName,
        'chunkSize' => 262144 // This will read data in smaller chunks, freeing up memory
    ]
);

try 
    $uploader->upload();
 catch (GoogleException $ex) 
    $resumeUri = $uploader->getResumeUri();
    $uploader->resume($resumeUri);


$vision = new VisionClient();
$image = $vision->image($bucket->object($imageName), [
    'FACE_DETECTION'
]);

$vision->annotate($image);

https://googlecloudplatform.github.io/google-cloud-php/#/docs/google-cloud/v0.63.0/storage/bucket?method=getResumableUploader

【讨论】:

我不认为这与图片的大小有关。在示例中,图像小于 1MB。它是运行时返回的对象 $vision->annotate($image);这需要 100MB 的内存,因为图片中有大约 20k 个字符,并且返回的对象包含一个数组,其中包含图像中每个字符的多个变量(使用 DOCUMENT_TEXT_DETECTION 时)。 啊,对不起,我误会了!我可以想到两个可能的选择: - 增加内存限制:ini_set('memory_limit', '500M'); - 使用图像上下文设置服务应尝试在图像中注释数据的位置的边界。这将允许您将数据分解为多个请求。 cloud.google.com/vision/docs/reference/rest/v1/images/…

以上是关于PHP Google Cloud Vision API:注释立即淹没内存的主要内容,如果未能解决你的问题,请参考以下文章

google vision - 在 c# 中从 google.cloud.vision.v1.entity 注释转换为 json

json Google Cloud Vision API OpenAPI

Google Cloud Vision Document OCR - 在结果文本中保留布局

IndexError:带有 Google Cloud Vision API 的字节数组

Google Cloud Vision API PDF 文本提取

如何通过HTTP请求验证Google Cloud Vision