Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Äter minne!, Hjälp! DirectoryEntry.Children (LDAP)

Postades av 2010-01-27 09:33:52 - Andreas Olausson, i forum c# (c-sharp), Tråden har 4 Kommentarer och lästs av 1535 personer

Jag håller på med en applikation för att uppdatera lite saker i en katalog.

Katalogen innehåller ca 90000 användare (OU=Users)

<code>
DirectoryEntry Users = new DirectoryEntry(ldapUserRoot, userName, password, at);

foreach (DirectoryEntry User in Users.Children)
{
// Här går det åt minne som fan.
}
</code>

Jag har provat att köra den som [MTAThread] utan resultat
Det funkar inte att köra User.Dispose(); i slutet på varje loop.

När jag kommer in i denna metod står minnet på ca 150MB men när jag kört igenom alla poster i ligger minnet på mer än 3 GB!!!


Hur får jag ner minnet, detta är ohållbart!

Tack på förhand
mvh
Andreas


Svara

Sv: Äter minne!, Hjälp! DirectoryEntry.Children (LDAP)

Postades av 2010-01-27 10:00:32 - Mikael Johansson

Nu vet jag inte alla detaljer när det gäller ldap, men undvik foreach.
Varje gång du arbetat genom en användare kommer den gå genom listan igen.
Det kan bli mååånga poster. Idealet är att spara ner användarna i en lista, kolla hur många det är och sen använda for-loop.

<code>
DirectoryEntry Users = new DirectoryEntry(ldapUserRoot, userName, password, at);
int count = Users.Count;

for(int i = 0; i < count; i++)
{
//Gör det du ska
}
</code>

Vet inte om exakt den koden fungerar, men du förstår säkert principen. Lägg inte Users.Count inne i for-villkoret då den kommer räkna antalet poster i listan varje gång du läser villkoret (med 90 000 poster blir det 90 000 ggr du räknar fram samma sak).


Svara

Sv: Äter minne!, Hjälp! DirectoryEntry.Children (LDAP)

Postades av 2010-01-27 13:26:26 - Cecilia Wirén

Menar du att går det mycket åt mycket minne även om du inte gör nåt i loopen?
Tycker defentivt att du skall ha en .Dispose() när du är klar med objektet i loopen. Den släpper de unmanaged resurerna som används av objektet, det borde iallafall ge en föränding i minnesåtgång.

I varje var av foreach-loopen släpps referensen till det "gamla" DirectoryEntry objektet iom detta kan Garbage Collectorn släppa tillbaka det minnet. Problemet vi har här är nog att GC inte körs och du får 90 000 objekt skräpandes i minnet. Och här skulle jag nog rekommendera att testa att trigga GC själv (Inget man egentligen skall gör men kanske ett undantag här). Dock så kommer GC att "frysa" applikationen varje gång den körs, inget som direkt märks i gränsnittet men dock kommer prestandan att gå ner, hela loppen kommer att ta längre tid.
Testa följande:

<code>
DirectoryEntry Users = new DirectoryEntry(ldapUserRoot, userName, password, at);

foreach (DirectoryEntry User in Users.Children)
{
// Gör ingenting här
User.Dispose();
}
</code>


Har du fortfarande mycket minnesbelastning prova följande:

<code>
DirectoryEntry Users = new DirectoryEntry(ldapUserRoot, userName, password, at);

foreach (DirectoryEntry User in Users.Children)
{
// Gör ingenting här
User.Close();
}
</code>

Close anropas av Dispose men Dispose säger även till för GC att den inte behöver städa det här objektet och det kan göra att objektet ligger och skräpar längre. Om du fortfarande inte får ner det prova:

<code>
DirectoryEntry Users = new DirectoryEntry(ldapUserRoot, userName, password, at);
int GCCounter = 0;
foreach (DirectoryEntry User in Users.Children)
{
// Gör ingenting här
User.Dispose();
GCCounter ++:
if (GCCounter > 1000)
{
GC.Collect();
GCCounter = 0;
}
}
</code>

Vet inte om sifran 1000 är optimal men den kan du ju testa lite olika.

När du hittat den lösning som minskar minnet sätt tillbaka koden som utför nåt i loopen och om du nu fortfarande har hög minnesåtgång får du visa oss den koden.


Svara

Sv: Äter minne!, Hjälp! DirectoryEntry.Children (LDAP)

Postades av 2010-02-03 15:44:05 - Andreas Olausson

Tack för input.

Det hela löste sig genom att först köra

GC.collect()

Men detta hjälpte inte jag var även tvungen att inkludera

GC.WaitForPendingFinalizers();

Det knepiga var att innan jag hittade den så lät jag tråden sova ett bra tag efter collect'en men det hjälpte inte.

Hur som helst, nu är jag nere i acceptabel nivå på minnet.


Svara

Nyligen

  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak
  • 16:14 Vem anlitar man egentligen när tak
  • 16:13 Vem anlitar man egentligen när tak
  • 11:52 Noen erfaring med uttak hos Mostbe
  • 11:51 Noen erfaring med uttak hos Mostbe

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 635
27 958
271 741
578
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies