|
6.84β9 で確認したところ、 2秒 固まる部分も治っており、
受信中に固まることを体感しなくなりました!
これにより、私が感じていた不都合は解消されました。
ありがとうございます!
> ちなみにこちらで10万通サーバーに置いてテストしました。
> 前回別スレッドにした処理は、0.06秒、今回別スレッドにした処理も0.06秒程度
>しかこちらではかかってなかったりします。
> なんで2秒もかかるのか・・・。
>
想像ですが、 UIDL.bin の並びと UIDL コマンドでダウンロードした UniqueId の並
びの問題ではないかと思うのですよね。
Office 365 の Exchange Online を使っているのですが、 Exchange Online の Uniq
ueId は 十進数の数値で表され、 UIDL コマンドでは十進数値としてソートされた状
態で取得されます。
一方 UIDL.bin のほうは 受信するたびに先頭に受信した順番に UID が追記されるよ
うですが、そのせいで頻繁にメールを受信する環境では UIDL.bin 内の UIDL の並び
順がきれいになりません。
例えば、 10分毎の定期受信で 3通ずつ メールを受信する場合、
UIDL コマンドで取得した UIDL は
先頭← ..., 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009 →末尾
と並びますが、 UIDL.bin では、
先頭← 1007, 1008, 1009, 1004, 1005, 1006, 1001, 1002, 1003, 1000, ... →末尾
と並んでしまいます。
> Version 6.76の時に、その比較の処理を、新旧のUIDLでの並び順が似ているという
>か、1日単位で見た場合はほぼ同じであることを利用して高速化
>
これがどのような処理なのか想像してみたのですが、 上記の Exchange Online の U
ID と UIDL.bin 記録の仕様の組み合わせと、この高速化の処理の仕様の相性が悪い
のかもしれません。
dump.txt のログを出力する設定にしてみましたが、 UIDL解析中 (1) と (2) がそれ
ぞれ 2.5秒 ずつほどかかっていました。
12:10:24.227 R ...(3173315バイト)
12:10:24.227 (9611) UIDL解析中...
12:10:24.227 (10799) UIDL解析中...
12:10:26.549 (8850) will Recv_UpdateRemoteMailAtStartRetr
12:10:26.565 (8917) done Recv_UpdateRemoteMailAtStartRetr
12:10:26.565 (9611) UIDL解析(2)
12:10:26.565 (10799) (2)
12:10:29.149 (9611) 0 / 5 済み (0K / 309Kバイト)
試しに、 UIDL.bin を 以下のような PowerShell コードで、 日付ごとに UID が降
順になるように書き換えてみたところ、 30ms 程度とそれこそ劇的に早くなりました。
$uidl = Get-Content UIDL.bin -Encoding Ascii;
$list = New-Object 'System.Collections.Generic.List[uint64]';
$key = '';
$uidl | %{ if ($_ -match '^\*') { if ($key -ne '') { Write-Output $key; } $l
ist | Sort-Object -Descending | Write-Output; $key = $_; $list.Clear() } els
e { $list.Add([uint64]$_) } } -End { Write-Output $key; $list | Sort-Object
-Descending | Write-Output; } | Set-Content UIDL2.bin -Encoding Ascii;
12:15:44.942 R ...(3173660バイト)
12:15:44.958 (9611) UIDL解析中...
12:15:44.958 (10799) UIDL解析中...
12:15:44.975 (8850) will Recv_UpdateRemoteMailAtStartRetr
12:15:44.992 (8917) done Recv_UpdateRemoteMailAtStartRetr
12:15:44.992 (9611) UIDL解析(2)
12:15:44.992 (10799) (2)
12:15:45.024 (9611) 0 / 20 済み (0K / 1168Kバイト)
今後受信するメールについては、 メールを受信する順番と UIDL.bin に追記する順
番を逆にすることで、 低速になってしまうことを回避できるのではないかと想像し
ます。
Exchange Online は UIDL の順番がわかるので上記のような書き換えが可能でしたが、
汎用的に考えると UIDL の文字列からその順番を求めることはできないため、すで
に受信してしまったものを救う上手な手立ては思いつきません。
… UIDLの解析に時間がかかっている環境の場合、 1度だけ 「UIDL.bin の整理」 と
して、 UIDL.bin の日付ごとの並びを UIDL で取得した順番の逆順になるように書き
換えてみるとか…?うーむ。。。
もし、 UIDL.bin や UIDL コマンドの結果があるとより検証しやすいのであれば、
公開フォーラムおくのはちょっと憚られるものの、直接メールでお送りいたします。
|
|