2015-04-10 7 views
9

Ho compilato Tesseract 3.04.00 con l'opzione OpenCL abilitata. Durante il tentativo di estrarre il testo da un'immagine usando GetUTF8Text(), c'è un errore malloc, una perdita di memoria, suppongo.malloc durante l'utilizzo di Tesseract con opzione OpenCL abilitata

Ho trovato una patch per un errore di perdita di memoria che è stato precedentemente aggiunto, tuttavia, la versione che ho compilato ha già aggiunto la patch. Non sono sicuro del motivo per cui si è verificata la perdita di memoria.

Questa è l'uscita sto ottenendo:

[DS] Profile read from file (tesseract_opencl_profile_devices.dat). 
[DS] Device[1] 1:Intel(R) Core(TM) i5-4250U CPU @ 1.30GHz score is 14049349632.000000 
[DS] Device[2] 1:HD Graphics 5000 score is 14049349632.000000 
[DS] Device[3] 0:(null) score is 21474836480.000000 
[DS] Selected Device[2]: "HD Graphics 5000" (OpenCL) 
ACP(15114,0x7fff795bf300) malloc: *** mach_vm_map(size=1125865547108352) failed (error code=3) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 

Qualcuno ha affrontato questo problema prima? Come posso risolvere questo?

risposta

2

Non ho familiarità con Tesseract, ma sospetto che la patch che hai indicato riguardasse problemi diversi.

Guardando nei dettagli di output, sembra che si stia utilizzando un computer Apple. Si prega di dare un'occhiata al link sottostante che contiene alcuni 'come' per l'installazione e l'utilizzo di Tesseract su Mac OS X: https://ryanfb.github.io/etc/2015/03/18/experimenting_with_opencl_for_tesseract.html

Spero che questo sia utile per risolvere il problema. Ad ogni modo, l'errore "impossibile allocare la regione" significa che non è rimasto spazio nella memoria. Anzi è stata richiesta un'enorme quantità di memoria (dimensione = 1125865547108352, circa 1.126 petabyte). Per capire cosa sta realmente accadendo, dovresti profilare il codice usando uno strumento di profilatura come gdb (infatti il ​​messaggio di errore dice "imposta un breakpoint in malloc_error_break per eseguire il debug"), o almeno carica un piccolo programma che può essere utilizzato per riprodurre il problema.

2

Si è esaurita la memoria. (codice errore = 3) "impossibile allocare regione" significa che malloc ha tentato di allocare più memoria di quella disponibile ..

Forse puoi provare a limitare il riconoscimento a un sub-rettangolo dell'immagine - chiama SetRectangle (sinistra, superiore, larghezza, altezza) dopo SetImage. Ogni SetRectangle cancella i risultati del riconoscimento in modo che più rettangoli possano essere riconosciuti con la stessa immagine. Per esempio.

api->SetRectangle(30, 86, 590, 100); 

Senza vedere il codice, direi o non state distruggendo oggetti e rilasciando la memoria o c'è un bug con quella versione. Per verificare se è il primo è possibile utilizzare uno strumento/libreria di rilevamento perdite di memoria, per verificare se è il più tardi è possibile eseguire il debug o provare semplicemente a utilizzare una versione diversa.