C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: フリーのOCR dllを使用した場合のメモリ解放について


(過去ログ 88 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■52517 / inTopicNo.1)  フリーのOCR dllを使用した場合のメモリ解放について
  
□投稿者/ ゴーン (1回)-(2010/08/12(Thu) 11:06:49)

分類:[VB.NET/VB2005 以降] 

VB2008&以下のフリーのOCR dllを使用して、文字読み取りツールを作成しようとしています。

http://www.pixel-technology.com/freeware/tessnet2/

ところが、以下のようにループしてOCR機能を繰り返し使用した場合、タスクマネージャを見ると
作成ツールのexeの使用メモリがどんどん蓄積され、数百メガになってしまいます。
このツールのexeを終了しないとこのメモリが解放されません。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ocr As New tessnet2.Tesseract()
        ocr.SetVariable("tessedit_char_whitelist", "-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
        ocr.Init(tessdataのあるフォルダ名, "eng", False)

        For i As Integer = 0 To 100
            Using image As New Bitmap(読み込ませるビットマップ)
                Dim result As List(Of tessnet2.Word) = ocr.doOCR(image, Rectangle.Empty)
                For Each word As tessnet2.Word In result
                    Console.WriteLine(word.Text)
                Next
            End Using
        Next
    End Sub

このツールを使い続けるとメモリ不足になってしまう危険性があるのですが、
どのようにすれば、蓄積されるメモリを適宜開放できるでしょうか?
アドバイスの程宜しくお願い申し上げます。

引用返信 編集キー/
■52521 / inTopicNo.2)  Re[1]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ 魔界の仮面弁士 (1744回)-(2010/08/12(Thu) 11:35:36)
No52517 (ゴーン さん) に返信
> Dim ocr As New tessnet2.Tesseract()

とりあえず上記を
 Using ocr As New tessnet2.Tesseract()
に変更してみては如何でしょう。

使ったことは無いですが、アセンブリをダウンロードして中を見たところ、
Tesseract は IDisposable のようですし。

あと、関係あるかどうかは分かりませんが、Clear というメソッド名も見えますね
引用返信 編集キー/
■52523 / inTopicNo.3)  Re[2]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ ゴーン (2回)-(2010/08/12(Thu) 12:54:34)
早速のアドバイス、誠にありがとうございます。
魔界の仮面弁士様のご指摘のように、Usingを使用してみましたが、メモリ使用量がどんどん増えています。
Clearメソッドも使ってみましたが、何の効果もありませんでした。

色々と調べると、英語のサイトでtessnet2はメモリリークがたくさんあるというようなことが書いてありました。
(英語には自信ありませんが)
アンマネージ(VC++あたり?)でメモリリークがあった場合、.NET側ではどのように対処できるのでしょうか?
何卒宜しくお願い申し上げます。
引用返信 編集キー/
■52524 / inTopicNo.4)  Re[3]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ 魔界の仮面弁士 (1745回)-(2010/08/12(Thu) 13:18:14)
No52523 (ゴーン さん) に返信
> 色々と調べると、英語のサイトでtessnet2はメモリリークがたくさんあるというようなことが書いてありました。
φ(..)

では、作業用の AppDomain を用意しておき、処理後に Unload してみては如何でしょう。
引用返信 編集キー/
■52525 / inTopicNo.5)  Re[4]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ ゴーン (3回)-(2010/08/12(Thu) 13:23:51)
いつもお世話になります。>魔界の仮面弁士様
ところで、AppDomainとは何でしょうか?
分かりやすく解説されているサイトはありますでしょうか?
(もしかして、初心者には敷居が高いですか?)
宜しくお願い申し上げます。
引用返信 編集キー/
■52526 / inTopicNo.6)  Re[3]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ 渋木宏明 (37回)-(2010/08/12(Thu) 13:51:32)
渋木宏明 さんの Web サイト
2010/08/12(Thu) 13:54:25 編集(投稿者)

> アンマネージ(VC++あたり?)でメモリリークがあった場合、.NET側ではどのように対処できるのでしょうか?

どうしようもありません。

そのコンポーネントのサポートを頼る(フリーものでは期待できないかもしれませんが)か、他のコンポーネントの利用を検討するのが現実解でしょう。

どうしても、ということなら、問題のコンポーネントを扱う部分を別プロセスに分離して、メモリリークが問題になる前にプロセスを起動しなおす、なんて手もあります。

が、プログラミングが複雑になるし、場合によっては性能も大きく劣化します。

>では、作業用の AppDomain を用意しておき、処理後に Unload してみては如何でしょう。

アンマネージコード内で起きたメモリリークには効果はありません。

引用返信 編集キー/
■52527 / inTopicNo.7)  Re[4]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ ゴーン (4回)-(2010/08/12(Thu) 14:34:20)
コメントありがとうございます。>渋木宏明様

どうしてもこのdllを使うのであれば、別プロセスに分離するとありますが、
具体的にはこのdllで利用する機能を別exeにして、exe間とのやりとりをするということでしょうか?
(その場合、exe間のやりとりはどのように行うのでしょうか?ファイル?)
宜しくお願い申し上げます。
引用返信 編集キー/
■52529 / inTopicNo.8)  Re[5]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ 渋木宏明 (38回)-(2010/08/12(Thu) 18:03:17)
渋木宏明 さんの Web サイト
> 具体的にはこのdllで利用する機能を別exeにして、exe間とのやりとりをするということでしょうか?

そうです。

> (その場合、exe間のやりとりはどのように行うのでしょうか?ファイル?)

いろいろな方法があります。

ファイルでもできると思いますが、即時性に欠けますよね。

.NET なら標準機能にリモーティングという仕組みが用意されているので、それを使えばいいんじゃないでしょうか。

引用返信 編集キー/
■52531 / inTopicNo.9)  Re[6]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ 渋木宏明 (39回)-(2010/08/12(Thu) 19:03:19)
渋木宏明 さんの Web サイト
> .NET なら標準機能にリモーティングという仕組みが用意されているので、それを使えばいいんじゃないでしょうか。

.exe 部分を VC++ とかで書くなら、OLE のアウトプロセスサーバにしてもいいし。
引用返信 編集キー/
■52533 / inTopicNo.10)  Re[3]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ Azulean (593回)-(2010/08/12(Thu) 20:41:17)
No52523 (ゴーン さん) に返信
> 色々と調べると、英語のサイトでtessnet2はメモリリークがたくさんあるというようなことが書いてありました。

ところで、この一文は真実ということで良いのでしょうか?
参考までに、「書いてありました」というページを教えていただけませんか。

これをお聞きする理由は、現状のプロセス分離が必要なことなのかどうかを疑っているためです。
回避できないメモリリークであり、さらに頻度・規模などによりプロセス分離しかないのであれば今の方針で良いですが、その逼迫具合がわかりませんでした。
引用返信 編集キー/
■52534 / inTopicNo.11)  Re[4]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ ゴーン (5回)-(2010/08/12(Thu) 21:01:41)
皆様、コメントありがとうございます。

>渋木宏明様
リモーティングについて、分かりやすく解説しているサイトはありますでしょうか?

>Azulean様
冒頭にも書きました、フリーのOCR dllのサイト(http://www.pixel-technology.com/freeware/tessnet2/)にも、
TesseractのC++ソースコードはメモリリークだらけだと書いてありますよ。
引用返信 編集キー/
■52536 / inTopicNo.12)  Re[5]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ Azulean (594回)-(2010/08/12(Thu) 23:45:09)
No52534 (ゴーン さん) に返信
> 冒頭にも書きました、フリーのOCR dllのサイト(http://www.pixel-technology.com/freeware/tessnet2/)にも、
> TesseractのC++ソースコードはメモリリークだらけだと書いてありますよ。

ありがとうございます。
確かにそのような主旨が書かれていることが確認できました。

あとはどの単位で切り分けるか、どのようなことを通信すべきか、通信手段をどうするかなど、要件・環境に応じて決めていくことになると思われます。
引用返信 編集キー/
■52538 / inTopicNo.13)  Re[5]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ 渋木宏明 (40回)-(2010/08/13(Fri) 02:04:34)
渋木宏明 さんの Web サイト
> リモーティングについて、分かりやすく解説しているサイトはありますでしょうか?

さて?僕は大抵、MSDN ライブラリしか読まないので (^^;

まだなら、まずは MSDN ライブラリの解説を読んでみてください。
MSDN ライブラリ読んで、分からないところがあったら検索、で大抵何とかなりますよ。

引用返信 編集キー/
■52553 / inTopicNo.14)  Re[5]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ やじゅ (1702回)-(2010/08/14(Sat) 19:16:43)
やじゅ さんの Web サイト
No52525 (ゴーン さん) に返信
> ところで、AppDomainとは何でしょうか?

海外サイトで、User AppDomainを作成してTessnet.dllを使用している質問がありました。
アンマネージドのメモリリークにおいては、User AppDomainをUnLoadしても駄目だよって回答が付いています。

AppDomain.CreateInstance* loads the target assembly into default AppDomain
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/e32b6f45-5808-448d-bc14-dbd974662bd1

便乗質問みたいな感じになるのですが、
何故、default AppDomainにmsvcm80とtessnet2が入るのかな、仕組み上そういうものなんでしょうか?

あと、User AppDomainを作成してUnloadしたとしても、やはりメモリは減少することはないのでしょうか?
自分で試そうとしたけど、ocr.Initを実行したとたんアプリケーションごと落ちてしまうので、やめてしまいました(^^;
引用返信 編集キー/
■52559 / inTopicNo.15)  Re[6]: フリーのOCR dllを使用した場合のメモリ解放について
□投稿者/ 渋木宏明 (44回)-(2010/08/15(Sun) 02:20:01)
渋木宏明 さんの Web サイト
2010/08/15(Sun) 02:57:26 編集(投稿者)

> 便乗質問みたいな感じになるのですが、
> 何故、default AppDomainにmsvcm80とtessnet2が入るのかな、仕組み上そういうものなんでしょうか?

msvcm80 はレガシ DLL なので、AppDomain に入りません。

tessenet2 は .NET のクラスライブラリですから、クラスライブラリを構成するアセンブリが AppDmain ロードされて、はじめて利用可能な状態になります。

アセンブリが default AppDomain に読み込まれるかどうかは、アセンブリをどのようにロードしたかに依存します。

> あと、User AppDomainを作成してUnloadしたとしても、やはりメモリは減少することはないのでしょうか?

リークしているのがアンマネージコード内で確保されたアンマネージなメモリであるなら、AppDomain どころか CLR とすらなんの関係もないので、リークが解消されることはありません。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -