私は、何百年ものバックアップで何百ものテーブルを実行し、人々が求めるコンテンツを変更するスクリプトを持っています。perlプロセスの途中でスクリプトからRAMを解放する
今月の時点では、サーバがそれを殺すほどのRAMを使い始めました。
私はそれをプルした後、データを実行してデータを検索し、情報を検索して、それが次のものを引っ張る前にRAMをリセットした後に、データベースからプルするたびに方法がありますか?
基本的には、引っ張ったデータをリセットするので、そのすべてがRAMにはないのですか?
私は2007年にこれを作成しましたが、私はそれを別の方法でやりたかったと思いますが、それは大幅なオーバーホールと更新が必要になります。多分未来。しかし今のところ、私はそれをすることはできません。
だから私はこれを起こさないようにする方法が必要です。
そのメモリをフラッシュする方法がわかっている場合は教えてください。
途中で私を指摘することができます場合は、事前にありがとうございます。
---アップデートは----実際にすべてのデータを引き出し、ウェブサイトのコードの一部を追加----
$_startingTime = time();
$dbh->do(qq{update `tun_changes` set `status` = "working", `startedT` = ? where `unid` = ?}, undef, $_startingTime, $_tr->{unid});
$sth2 = $dbh->prepare(qq{select * from `allmembers` where `mId` = ?});
$sth2->execute($_tr->{mId});
$_tregmem = $sth2->fetchrow_hashref();
$sth2->finish();
$dbh->do(qq{delete from `sessions` where `id` = "$_tregmem->{last_sessid}"}); #kill their logged in session, so it does not lock them up if they are logged in when we change their username...
$_un = $_tregmem->{tusername};
$_cust_id = $_tr->{mId};
$_notfinished = 0;
$_newUname = lc($_tr->{newun});
$_csusername = $_tr->{csusername};# if customer service rep...
$_count = 0;
$_changeFailed = 0;
$_changed = 0;
$_debugChg = 1;
if($_debugChg) {
open(DBG,">>/home$_website_username/required/files/urgent/all_chg_uname_debug_track.txt");
seek(DBG,0,2);
print DBG "Checking Table at " . Format_Date_For_Viewing($_startingTime,"") . " - indented two lines at least for this record.... until _end_ is shown\n";
}
@_mb = $dbh->tables;
$_tablesAffected = 0;
foreach $_k (@_mb) {
$_sql = "select * from $_k";
if($_debugChg) {
print DBG "\tTable $_k (" . duration(time() - $_startingTime) . " into action)\n";
}
$sth2 = $dbh->prepare($_sql);
$sth2->execute();
@_mb2 = @{$sth2->{NAME}};
foreach $_k2 (@_mb2) {
if($_debugChg) {
print DBG "\t\tColumn $_k2";
}
if($_k2 =~ /tusername/i) {
if($_debugChg) {
print DBG "\t Checking for username entries in $_k2\n";
}
$_updated = $dbh->do(qq{update $_k SET `$_k2` = ? WHERE `$_k2` = ?}, undef, $_newUname, $_un);
if($_updated) {
$_changed += $_updated;
} else {
$_changeFailed += $_updated;
}
} else {
if($_debugChg) {
print DBG " - Not UN\n";
}
}
}
$sth2->finish();
if($_debugChg) {
print DBG "\n";
}
}
if($_debugChg) {
print DBG "\nFinished - Duration was: " . duration(time() - $_startingTime) . "\n";
print DBG "\n_end_\n\n";
close(DBG);
}
私は、行われたものを見ることができるように、私はデバッグコードを残しました失敗の場合。
Perlには自動ガベージコレクタがあります。使用しているコードを表示することは賢明です。 – stevieb
私はコードでそれを更新しました。 – Rich
どの部分がほとんどのメモリを使いますか、ご存じですか?私はもう1つの可能性を持って自分の投稿を更新しました(あなたが投稿したコードを見るだけです)。 – zdim