Hoe het geheugen te wissen om “Out of Memory Fout” in Excel VBA te voorkomen?

Ik loop VBA-code op een grote spreadsheet. Hoe wist ik het geheugen tussen procedures / oproepen om een ​​probleem “Out of Memory” te voorkomen?

bedankt


Antwoord 1, Autoriteit 100%

Ik heb een oplossing gevonden. In het begin leek het dat het meer tijd zou nemen, maar het maakt eigenlijk alles wat soepeler en sneller werkt vanwege minder swapping en meer geheugen beschikbaar. Dit is geen wetenschappelijke benadering en het heeft wat tests nodig voordat het werkt.

In de code, maak Excel de werkmap zo nu en dan op. Ik moest door een vel lopen met 360 000 lijnen en het stikte slecht. Na elke 10 000 heb ik de code het werkboek opslaan en nu werkt het als een charme, zelfs op een 32-bit Excel.

Als u Task Manager begint tegelijkertijd kunt u het geheugengebruik zien, drastisch naar beneden gaan na elke opslag.


Antwoord 2, Autoriteit 88%

De beste manier om het geheugen te helpen bevrijden is om grote objecten te vernietigen:

Sub Whatever()
    Dim someLargeObject as SomeObject
    'expensive computation
    Set someLargeObject = Nothing
End Sub

Houd er ook rekening mee dat de wereldwijde variabelen van één oproep naar een ander zijn toegewezen, dus als u geen persistentie nodig heeft, moet u geen globale variabelen gebruiken of deze niet langer nodig hebben wanneer u ze niet langer nodig hebt.

Dit zal echter niet helpen als:

  • U hebt het object na de procedure nodig (uiteraard)
  • Uw object past niet in het geheugen

Een andere mogelijkheid is om over te schakelen naar een 64-bits versie van Excel die meer RAM zou moeten kunnen gebruiken voordat u crasht (32 bits-versies zijn meestal beperkt op ongeveer 1,3 GB).


Antwoord 3, Autoriteit 25%

Het antwoord is dat je dit niet expliciet kunt doen, maar je zou geheugen vrij moeten maken in je routines.

Enkele tips om het geheugen te helpen

  • Zorg ervoor dat u object op nul zet voordat u uw routine verlaat.
  • Zorg ervoor dat je Close roept op objecten als ze dit nodig hebben.
  • Gebruik geen globale variabelen tenzij absoluut noodzakelijk

Ik raad je aan om het geheugengebruik te controleren nadat je de routine steeds opnieuw hebt uitgevoerd, je zou een geheugenlek kunnen hebben.


Antwoord 4, autoriteit 6%

Als je met een grote dataset werkt, is het heel goed mogelijk dat er arrays worden gebruikt.
Voor mij veroorzaakte het maken van een paar arrays van een werkblad van 500 000 rijen en 30 kolommen deze fout. Ik heb het eenvoudig opgelost door de onderstaande regel te gebruiken om de array te verwijderen die ik niet langer nodig heb, voordat ik een nieuwe maak:

Erase vArray

Als er slechts 2 van de 30 kolommen worden gebruikt, is het ook een goed idee om twee arrays met 1 kolom te maken in plaats van één met 30 kolommen. Het heeft geen invloed op de snelheid, maar er zal een verschil zijn in geheugengebruik.


Antwoord 5

Ik vond deze thread op zoek naar een oplossing voor mijn probleem. De mijne vereiste een andere oplossing waarvan ik dacht dat die van nut zou kunnen zijn voor anderen. Mijn macro was het verwijderen van rijen, het opschuiven en het kopiëren van rijen naar een ander werkblad. Het geheugengebruik explodeerde tot verschillende optredens en veroorzaakte “onvoldoende geheugen” na het verwerken van ongeveer 4000 records. Wat heeft het voor mij opgelost?

application.screenupdating = false

Toegevoegd aan het begin van mijn code (zorg ervoor dat je het aan het einde weer waar maakt)
Ik wist dat het daardoor sneller zou werken, wat het ook deed… maar ik had geen idee van het geheugen.

Na deze kleine wijziging was het geheugengebruik niet hoger dan 135 mb. Waarom werkte dat? Geen idee eigenlijk. Maar het is het proberen waard en kan op jou van toepassing zijn.


Antwoord 6

Ik was in staat om deze fout op te lossen door simpelweg een variabele te initialiseren die later in mijn programma werd gebruikt. Op het moment gebruikte ik de optie expliciet niet in mijn klas / module.


Antwoord 7

Ik had een vergelijkbaar probleem dat ik mezelf heb opgelost …. Ik denk dat het gedeeltelijk mijn code was die te veel geheugen hoger was, terwijl te veel “grote dingen”

In mijn aanvraag gaat het werkboek uit en grijpt een ander afdelingen “Dagelijks rapport” .. en ik extraheer alle informatie die onze teambehoeften (om fouten en gegevensinvoer te minimaliseren).

Ik haal direct in hun lakens … maar ik haat het feit dat ze samengevoegde cellen gebruiken … die ik van (dwz demping afkom, vind dan de resulterende lege cellen en vul de waarden van bovenaf)

Ik heb mijn probleem laten verdwijnen met

A) Ondraagbare alleen de “gebruikte cellen” – in plaats van alleen maar proberen om hele kolom te doen … dwz het vinden van de laatst gebruikte rij in de kolom, en alleen dit bereik leegmaken (er is letterlijk 1000s rijen op elk van de blad ik grijp)

b) Wetende dat het ongedaan maken alleen voor de laatste ~ 16-evenementen zorgt … tussen elke “UNMERGE” – heb ik 15 gebeurtenissen geplaatst die wissen wat wordt opgeslagen in de “Ongedaan maken” om de hoeveelheid geheugen op te lossen ( Dwz ga naar een cel met gegevens erin .. en kopieer // plakken speciale waarde … Ik gokte dat de geaccumuleerde som van 30 achterkant elk met 3 kolommen aan gegevens aan de belastingsgeheugen kunnen worden ingesteld als kant voor het ongedaan maken van

Ja, het staat geen enkele kans op een ongedaan gemaakt … maar het hele doel is om de oude informatie te zuiveren en in de nieuwe tijdgevoelige gegevens te trekken voor analyse, dus het was geen probleem

Souny Corny – Maar mijn probleem ging weg

Other episodes