2011-06-13 6 views
8

Kod dosyaları arayan dizindeki her dosyadan geçen ve bunları bir şekilde değiştiren bir toplu iş komut dosyası yazıyorum. Bu görevi bitirdikten sonra, 6,000 dosya ile büyük bir dizinde çalıştırmayı denedim. Komut dosyasında yaklaşık 40 dakika çöktü ve komut isteminden çok sayıda bellek hatası aldım, görev yöneticisine bakarken betiği çalıştırdığımda programımın bellek yineleme döngüsü başına 1MB hızında olduğunu gösterdi. Doğal olarak yanlış bir şey yaptığımı düşündüğümde, sorunu yalıtmak için yazdığım tüm kodları kestim. Ama sonra bir döngü dışında boş bir dosya ile kalmıştı ve sorun hala devam ediyordu! Aslında bunu aşağı trim mümkün olmuşturBellek için bellek sızıntısı döngüde mi?

@echo off 
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
set directory=%CD% 
for /R "%directory%" %%a in (*.c *.cpp *.h *.idl) do (
    set currentDir=%%~dpa 
    pushd !currentDir! 
    popd 
) 

:

@echo off 
for /R "%CD%" %%a in (*) do echo 

Ve sorun hala devam ediyorsa İşte

Söylediğim gibi oldukça büyük bir dizinde koştu budur.

Toplu iş için bellek sızıntısı var mı yoksa sadece yanlış bir şey mi yapıyorum?

ben test edilmiş ve sorun hala bu kadar çok geçici bir çözüm olarak bir cevap değil Service Pack 3.

+0

Düğme itme komutundan hemen sonra gelen nokta nedir? Bu bana mantıklı gelmiyor. Bundan hiçbir şey başaramayacaksın (sadece 2 dizin arasında gidip geliyor). – steenhulthin

+0

Gerçek kodumun ne yaptığını taklit ediyorum. Tam dosyada, itme ve pop arasında bir sürü şey var. – Maynza

+0

tamam, sanırım, kodun gösterilmediği yerde eklemelisiniz. – steenhulthin

cevap

2

mevcuttur doğruladı rağmen Windows XP 32bit Service Pack 2 (veya yeniden) duyuyorum. Senaryonuzu çalıştırdım ve bir miktar hafıza tükendiğini görüyorum, ki bunlardan bazıları betik bitene kadar serbest bırakılmıyor, ama yineleme başına 1 MB civarında bir şey elde edemiyorum. (Sadece @aphoria gibi betiği cc'nin kökü üzerinde çalıştırabilirim: XP SP3 ve Vista'da sorun olmadan.)

Komut dosyası için gerekli olmayan işlemleri kapatmanızı ve komut dosyanızı bir alt dizinde zaman.

Bunu başka bir şekilde çözemezseniz, komut dosyasını Powershell'de yazmayı denemenizi öneririz.

+1

Bu, aslında yaptığımız şey. – Maynza

1

Sorun, CMD.EXE ve COMMAND.COM kullanım için belirli bir miktarda bellek ayırması gerçeği yatıyor. Genellikle toplu iş dosyalarını çok fazla işlem yapmak için kullanırken, komut dosyasının kullanabileceği bellek iş yükünü arttırmak istersiniz.

Çalıştırdığınız işletim Çevre bağlı olarak, aşağıdakileri yapabilirsiniz:

WINDOWS NT/2000/XP: Örneğin, ile/e anahtarını COMMAND.COM ortam bellek değiştirebilir :

command.com /e:2048 /c BatchFile.BAT 

2048 bayt çevre bellek ile bir kabuk içinde BatchFile.BAT çalışır. WINDOWS 95/98


/ME: Bir özellikle MS-DOS penceresinde veya belirli Toplu dosyasına Kısayolu'na ayrılan çevre hafızayı değiştirebilir. Özellikler iletişim kutusunu açın (Kısayol veya Masaüstü simgesini sağ tıklatın ve Özellikler'i tıklatın). Bellek Sekmesini tıklatın.Değişkenleriniz için yeterli olan boyutunu ayarlamak için ilk ortam aşağı açılan kutusunu kullanın, 2048 bayt (veya isterseniz daha fazla) söyleyin.

Güvende olmak için, disk belleği kullanımınızı da artıracağım.