D言語

スタンバイ状態

ダウンロード、ダウンロード完了後のキャッシュ変換で、メモリ使用量が増える問題は、例のごとく大きい配列をdeleteするように修正すると解決しました。 4時間ほどジャッカルをダウンロードし続けても、メモリ使用量は20MBほどです。しかーし、PCからはなれ…

Threadのpauseとresume

以前、スレッドのポーズとレジュームが勝手にGCから操作されるとわめいていましたが、勘違いでした。 ごめんなさい。二度ポーズしたスレッドは、2度レジュームしないと動かないです。

phobosいきなりです

D言語をもうとてもがんばろうと思って、最新のDMD v0.146を取ってきて、phobosをデバッグ用にコンパイルしたらunittestに失敗しました。 場所 phobos/std/path.d // getDrive(r"d:\path\foo.bat") => "d:" int isabs(char path) { char d = getDrive(path); …

ちょっと気になる

デバッグ版のphobosのsocket.dが起動時にunittestしてprintfするのが気になる・・。 追記 デバッグ版は契約が働くのでいい感じ。 おかげで、キーのチェックサム偶然一致によりファイル名が復号されないというバグを発見できました・・。 (toStringzのoutでassert…

CPU使用率とデバッガ

昨日またポエニーでCPU使いすぎ現象がでて、どうしたもんかと今日ずーと考えていたのに、その原因がデバッガで動かしていたということでした。(VisualStudio) デバッガを使った場合は、キーが1万個を越えたあたりからCPU使用率が80〜99%になり、デバッガを使…

ポエニーのGUI

ポエニー用にWindowsのGUIを書いてみた。ねむ。最近は組込系ばかりなので、Windowを作ったのは1年半ぶりくらい。 もともと、これが面倒でウェブベースでやっていたのだけど、どうもウェブベースは嫌われる傾向があるようなので、簡単そうに見えたDFLを使って…

更新時間

Winnyは、自分とこのシステム時計より未来の更新時間を持つキーを削除してしまうみたい。ポエニーで、ファイルの更新時間をキャッシュ生成時刻にしていて、キャッシュ生成時刻=Dのstd.c.time(null)にしていたのですが、Dのstd.c.time(null)はUTCで返すような…

gdcのGCも

dmdのGCがメモリを開放しないことがどーしても気になるので、少し期待を持ってgdcをMinGW環境にインストールして試してみました。 結果的には、だめで、dmdで開放できているパターンでも開放できないメモリがあるようです。

保守的なGC

2ちゃんねるのD言語スレで、GCの話題が出ている。保守的なGCなので、ubyteの配列の中にでも偶然ポインタとしてみるとGCが拡張したメモリアドレスを指すようなデータがあると、GCは参照があると判断して開放しないそうな。 ポエニーでは、IPアドレスや日本語…

synchronized文とセマフォ待ち行列と愚痴と言い訳

@ 問題の発端 ポエニーで、通信だけは速く動かして、あとは限界に達するまでは、内部で受信コマンドをキューに貯めながら処理していこうと思って、コネクション管理タスクをディレイなしでフル稼働させたら、他のタスクがコネクションテーブル(コネクション…

「length」というローカル変数を使う際に注意すべきこと

import std.stdio;int main() { static char str = "123456789"; // TEST 1 int length = search(str, '5'); writef("%s\n", str[0 .. length]); // TEST 2 int len = search(str, '5'); writef("%s\n", str[0 .. len]); return 0; }int search(char str, ch…

メモリ使いすぎ 9

SQLiteを使うとCPU使用率がすごい・・・。

メモリ使いすぎ 10

今度こそ、この話は終了。 今度こそ、もうバグや課題はない。D言語も自称中級者くらいになった。最終的には、キーテーブルをSQLiteのテンポラリーテーブルに入れるようにして、そしたらCPU負荷が高すぎでブラウザなどが動かなくなったので、適当にディレイを…

SQLite

会社で暇を見ながら、SQLite3のページをまんべんなく読んだ。 APIは、よく作ってあって、メモリの管理に関しても、どれを誰が管理するかきっちりしている。 雰囲気は、APRと似ていて、Cなりにオブジェクト指向ライクな感じ。 処理の流れ的には、sqlite3_open…

メモリ使いすぎ 8

GCが動いてないっぽい件は、たぶんOK。 多くても50MB以内で動いている。(と今のところ見える)で、仕事から帰って疲れて冷静になった頭で考えると、そもそもレコード数が2万行を超えるかもしれないテーブルをがんばって全部メモリに入れようとしているのが…

メモリ使いすぎ 2

クエリ応答でmax値を計算するだけして、それを見ずにヒットするだけ全部キー情報を作って送っていた・・・。 前は大丈夫だったんだけど、年末に作り直したときのミス。これは結構影響してそう。

メモリ使いすぎ 2 〜謝罪〜

正直ね、GCがまじめに働いていないと思っていたよ。 だってね、メモリの管理をしなくてもいいってGCが言っているので、本当にしなかったら、どうみてもメモリリークしてます。 なんでね、もうD言語やめて、C++で書き直そうかと本気で考えたよ。 プログラムに…

メモリ使いすぎ 3

http://d.hatena.ne.jp/riesling/20060109/p1 一度拡張された領域は、縮小しないらしい。私が、GCを変だと思っていた原因のひとつに次のような現象ありました。 検索ヒットの数の多いキーワードで検索したときに、大量の検索結果データを作るのでごわーと使…

メモリ使いすぎ 4 〜 GCの単純なテスト 〜

試してみたよ。 import std.stdio; import std.gc; import std.random; import std.md5; import std.thread;int main() { debug(b1) { uint optval = 0; test1(&optval); } debug(b2) { uint optval = 1; test1(&optval); } debug(b3) { uint optval = 1; Th…

メモリ使いすぎ 5

タスクのベースクラスのポーズで自分で自分のポーズを呼び出した場合(ポエニーの場合はイベント待ち行列に並ぶとき)に前回のfullCollectから一定時間以上たっていたらfullCollectを呼ぶようにした。 かなりいい感じ。 キー数5000以上になっても使用メモリ…

メモリ使いすぎ 6

debug(b5) { uint optval1 = 0, optval2 = 1; Thread t1 = new Thread(&test1, &optval1); t1.start(); test1(&optval2); t1.wait(); } スレッドの親がfullCollectしていたら、大丈夫?

メモリ使いすぎ 7

メインの処理をループ内で呼び出す関数の中に全部入れて、何度か試した結果適切と思われる位置(関数内の処理の最後)にfullCollectをいれたところ、20MBを超えることがなくなった。 といっても、まだ1時間ほどしか動いてないけど。 今までは1時間後にはもの…

Error: divide by zero

-O オプションをつけると、0除算エラーが出てる。 -Oをつけないと出ない。 コンパイラがバグってる。コンパイルできない。 追記 ソースがでかすぎてどこが原因でそうなるかぜんぜん分からない・・・。 今のところは、そう問題ないのだけど。

Privileged instruction 6

とりあえず、binary treeとhash tableをテキトーに作って、連想配列の変わりに使ったら、ふつーに動いている。 ベンチマーク取ったら、組み込みの連想配列よりかなり遅くて凹んだので、そのうち賢いアルゴリズムに書き換えよう。(メモ)作る途中に思ったん…

メモリ使いすぎ 1

使用メモリが増えるごとに、使用メモリが増える比率が上がり、どんどん増えまくる現象。 どうも、保持キー数に関係しているようなんだけど、2000個のときは、8MBくらいしか使っていないのに、6000個になるころには、200MB以上いってるので、単純にキーのサイ…

メモリ使いすぎ 2

ガベージコレクション - プログラミング言語 D (日本語訳) を見ると本当に感動しそうなことが書かれているのだけど、どうも違う。 一応、使わなさそうなデータをクラスメンバが参照している箇所をnullで埋めるようにしてみたら、多くて80MBくらいに抑えられ…

ポエニー(途中) 20060109

これからアップロード機能を作るので区切り。poeny20060109 D言語のソースコード付き(途中)@ 変更点 キーテーブルを組み込み連想配列から自作クラスに変更(なぜか落ちるため) バグ(?)修正。 メモリの無駄遣いを少しやめた 改善。 落ちてもがんばって復旧す…

Privileged instruction 5

マルチスレッドは関係ないということと、削除(remove)をしていると現象が起こるというところまでわかりましたが、削除後必ずrehashすると起こらないということがわかったので、とりあえずはこれで対応します。 しかし、削除があるたびにrehashするのは、かな…

dup

もうDを始めて半年近くたつが、未だに配列をどこでdupするべきか分からない。 基本は、copy-on-writeらしいが、クラスが絡んでくるとメンバ変数に配列を代入することがあり、呼び側がローカル変数の配列である可能性もあるため、代入メソッド内でdupするか、…

Privileged instruction 4

テストプログラムを書いてみたところ、シングルスレッドでもかなり頻発するのでスレッドは関係ないことが分かった。 pes.system.lockerのexist/removeを使わなければ起こらないので、これがかなり悪いのか、削除すると発生するのか調べ中・・・。 とりあえず、i…