Erreur de soumission de travail par lots « Impossible de traiter tous les documents » L'uris semble correct ?
P粉696891871
P粉696891871 2024-03-31 14:10:13
0
2
296

J'ai essayé de faire fonctionner les soumissions par lots de Document AI, mais je rencontre quelques difficultés. J'ai utilisé un RawDocument pour la soumission d'un seul fichier en supposant que je pouvais parcourir mon ensemble de données (27 000 images), mais j'ai opté pour le traitement par lots car cela semblait être la technique la plus appropriée.

Lorsque j'exécute le code, je vois l'erreur : "Impossible de traiter tous les documents". Les premières lignes d'informations de débogage sont :

O:17:"GoogleRpcStatus":5:{ s:7:"*Code";i:3;s:10:"*Message";s:32:"Impossible de traiter tous les documents."; s:26 : "Détails GoogleRpcStatus" ; O:38:"GoogleProtobufInternalRepeatedField":4:{ s:49:"GoogleProtobufInternalRepeatedFieldcontainer";a:0:{}s:44:"GoogleProtobufInternalRepeatedFieldtype";i:11;s:45:"GoogleProtobufInternalRepeatedFieldklass";s:19:"GoogleProtobufAny";s:52:"GoogleProtobufInternalRepeatedFieldlegacy_k fille"; 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";```

Le support pour ce bug indique que la cause de l'erreur est :

Les paramètres

gcsUriPrefix et gcsOutputConfig.gcsUri doivent commencer par gs:// et se terminer par une barre oblique inverse (/). Vérifiez la configuration de l'URI du bucket.

Je n'utilise pas gcsUriPrefix (dois-je ? Mon compartiment > Limites maximales de lots), mais mon gcsOutputConfig.gcsUri est dans ces limites. La liste de fichiers que je fournis donne les noms de fichiers (pointant vers le bon compartiment), il ne devrait donc pas y avoir de barre oblique inverse de fin.

Bienvenue pour consulter

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

répondre à tous(2)
P粉103739566

Habituellement, l'erreur “无法处理所有文档” est causée par une syntaxe incorrecte du fichier d'entrée ou du compartiment de sortie. Puisqu'un chemin mal formé peut toujours être un chemin "valide" vers le stockage cloud, mais pas le fichier que vous attendiez. (Merci d'abord de vérifier la page des messages d'erreur !)

Si vous souhaitez fournir une liste de documents spécifiques à traiter, vous n'êtes pas obligé d'utiliser gcsUriPrefix。尽管根据您的代码,您似乎还是将 GCS 目录中的所有文件添加到 BatchDocumentsInputConfig.gcs_documents 字段,因此尝试在 中发送前缀是有意义的>BatchDocumentsInputConfig.gcs_uri_prefix à la place d'une liste de fichiers individuels.

Remarque : Il existe un nombre maximum de fichiers pouvant être envoyés dans une seule demande par lots (1 000), et les processeurs spécifiques ont leurs propres limites de pages.

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

Vous pouvez essayer de diviser le fichier en plusieurs requêtes par lots pour éviter d'atteindre cette limite. Le SDK Python de Document AI Toolbox dispose d'une fonction intégrée à cet effet, mais vous pouvez essayer de réimplémenter cette fonction en PHP en fonction de votre cas d'utilisation. https://github.com/googleapis/python-documentai-toolbox/blob/ba354d8af85cbea0ad0cd2501e041f21e9e5d765/google/cloud/documentai_toolbox/utilities/gcs_utilities.py#L213

P粉195402292

Cela s'est avéré être un bug ID-10-T avec des connotations claires PEBKAC.

$object->name() ne renvoie pas le nom du bucket dans le chemin.

résoudra $doc->setGcsUri('gs://'.$object->name()); 更改为 $doc->setGcsUri('gs://'. $bucketName.'/'.$object->name()); le problème.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!