Fehler bei der Übermittlung des Batch-Jobs: „Es können nicht alle Dokumente verarbeitet werden.' URIS scheint korrekt zu sein?
P粉696891871
P粉696891871 2024-03-31 14:10:13
0
2
460

Ich habe versucht, die Stapelübermittlung von Document AI zum Laufen zu bringen, bin aber auf einige Schwierigkeiten gestoßen. Ich habe ein RawDocument für die Übermittlung einer einzelnen Datei verwendet, vorausgesetzt, ich könnte meinen Datensatz (27.000 Bilder) durchlaufen, habe mich aber für die Stapelverarbeitung entschieden, da dies die geeignetere Technik zu sein schien.

Wenn ich den Code ausführe, wird die Fehlermeldung angezeigt: „Es können nicht alle Dokumente verarbeitet werden.“ Die ersten paar Zeilen mit Debug-Informationen lauten:

O:17:"GoogleRpcStatus":5:{ s:7:"*Code";i:3;s:10:"*Message";s:32:"Es konnten nicht alle Dokumente verarbeitet werden."; s:26:"GoogleRpcStatusdetails"; O:38:"GoogleProtobufInternalRepeatedField":4:{ s:49:"GoogleProtobufInternalRepeatedFieldcontainer";a:0:{}s:44:"GoogleProtobufInternalRepeatedFieldtype";i:11;s:45:"GoogleProtobufInternalRepeatedFieldklass";s:19:"GoogleProtobufAny";s:52:"GoogleProtobufInternalRepeatedFieldlegacy_klass"; s:19:"GoogleProtobufAny";}s:38:"GoogleProtobuf InternalMessagedesc";O:35:"GoogleProtobufInternalDescriptor":13:{s:46:"GoogleProtobufInternalDescriptorfull_name";s:17:"google.rpc.Status";s : 42:"GoogleProtobufInternalDescriptorfield";a:3:{i:1;O:40:"GoogleProtobufInternalFieldDescriptor":14:{s:46:"GoogleProtobufInternalFieldDescriptorname ";s:4:"code";```

Der Support für diesen Fehler gibt an, dass die Fehlerursache folgende ist:

gcsUriPrefix- und gcsOutputConfig.gcsUri-Parameter müssen mit gs:// beginnen und mit einem Backslash-Zeichen (/) enden. Überprüfen Sie die Konfiguration des Bucket-URI.

Ich verwende nicht gcsUriPrefix (sollte ich? Mein Bucket > Max. Batch-Limits), aber mein gcsOutputConfig.gcsUri liegt innerhalb dieser Grenzen. Die von mir bereitgestellte Dateiliste enthält die Dateinamen (die auf den rechten Bucket verweisen), daher sollte kein abschließender Backslash vorhanden sein.

Willkommen zur Beratung

function filesFromBucket( $directoryPrefix ) {
        // NOT recursive, does not search the structure
        $gcsDocumentList = [];
    
        // see https://cloud.google.com/storage/docs/samples/storage-list-files-with-prefix
        $bucketName = 'my-input-bucket';
        $storage = new StorageClient();
        $bucket = $storage->bucket($bucketName);
        $options = ['prefix' => $directoryPrefix];
        foreach ($bucket->objects($options) as $object) {
            $doc = new GcsDocument();
            $doc->setGcsUri('gs://'.$object->name());
            $doc->setMimeType($object->info()['contentType']);
            array_push( $gcsDocumentList, $doc );
        }
    
        $gcsDocuments = new GcsDocuments();
        $gcsDocuments->setDocuments($gcsDocumentList);
        return $gcsDocuments;
    }
    
    function batchJob ( ) {
        $inputConfig = new BatchDocumentsInputConfig( ['gcs_documents'=>filesFromBucket('the-bucket-path/')] );
    
        // see https://cloud.google.com/php/docs/reference/cloud-document-ai/latest/V1.DocumentOutputConfig
        // nb: all uri paths must end with / or an error will be generated.
        $outputConfig = new DocumentOutputConfig( 
            [ 'gcs_output_config' =>
                   new GcsOutputConfig( ['gcs_uri'=>'gs://my-output-bucket/'] ) ]
        );
     
        // see https://cloud.google.com/php/docs/reference/cloud-document-ai/latest/V1.DocumentProcessorServiceClient
        $documentProcessorServiceClient = new DocumentProcessorServiceClient();
        try {
            // derived from the prediction endpoint
            $name = 'projects/######/locations/us/processors/#######';
            $operationResponse = $documentProcessorServiceClient->batchProcessDocuments($name, ['inputDocuments'=>$inputConfig, 'documentOutputConfig'=>$outputConfig]);
            $operationResponse->pollUntilComplete();
            if ($operationResponse->operationSucceeded()) {
                $result = $operationResponse->getResult();
                printf('<br>result: %s<br>',serialize($result));
            // doSomethingWith($result)
            } else {
                $error = $operationResponse->getError();
                printf('<br>error: %s<br>', serialize($error));
                // handleError($error)
            }
        } finally {
            $documentProcessorServiceClient->close();
        }    
    }

P粉696891871
P粉696891871

Antworte allen(2)
P粉103739566

通常,错误“无法处理所有文档”的原因是输入文件或输出存储桶的语法不正确。由于格式不正确的路径可能仍然是云存储的“有效”路径,但不是您期望的文件。 (感谢您首先检查错误消息页面!)

如果您要提供要处理的特定文档列表,则不必使用 gcsUriPrefix。尽管根据您的代码,您似乎还是将 GCS 目录中的所有文件添加到 BatchDocumentsInputConfig.gcs_documents 字段,因此尝试在 中发送前缀是有意义的>BatchDocumentsInputConfig.gcs_uri_prefix 而不是单个文件的列表。

注意:单个批处理请求中可以发送的文件最大数量(1000),并且特定处理器有自己的页面限制。

https://cloud.google.com/document-ai/quotas#content_limits

您可以尝试将文件分成多个批处理请求,以避免达到此限制。 Document AI Toolbox Python SDK 具有用于此目的的内置函数,但您可以尝试根据自己的用例在 PHP 中重新实现此函数。 https:// github.com/googleapis/python-documentai-toolbox/blob/ba354d8af85cbea0ad0cd2501e041f21e9e5d765/google/cloud/documentai_toolbox/utilities/gcs_utilities.py#L213

P粉195402292

这被证明是一个 ID-10-T 错误,具有明确的 PEBKAC 泛音。

$object->name() 不会将存储桶名称作为路径的一部分返回。

$doc->setGcsUri('gs://'.$object->name()); 更改为 $doc->setGcsUri('gs://'. $bucketName.'/'.$object->name()); 解决了该问题。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage