Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Grote Bestanden Verwerken | Prestatieverbetering Met Ingebouwde Hulpmiddelen
Optimalisatietechnieken in Python

bookGrote Bestanden Verwerken

Het efficiënt verwerken van grote bestanden is essentieel bij het werken met datasets die te groot zijn om in het geheugen te passen. Python biedt hulpmiddelen zoals open() en map(), waarmee bestanden lui verwerkt kunnen worden, wat geheugen bespaart en de prestaties verbetert.

Wat zijn iterators?

Voordat we verder gaan met de open()-functie, moeten we eerst begrijpen wat een iterator is. Een iterator is een object dat een stroom van gegevens vertegenwoordigt, waarmee je één item tegelijk kunt benaderen. Iterators implementeren twee methoden:

  • __iter__(): retourneert het iterator-object zelf;
  • __next__(): retourneert het volgende item in de stroom en geeft een StopIteration-fout als er geen items meer zijn.

Stel dat we een iterator hebben genaamd iterator_object. We kunnen hierover itereren met een gewone for-lus:

for element in iterator_object:
    ...  # Process the element

In feite gebeurt het volgende onder de motorkap (de functie next() roept intern de methode __next__() van de iterator aan):

while True:
    try:
        element = next(iterator_object)
        ...  # Process the element
    except StopIteration:
        break

In tegenstelling tot standaardcollecties worden iterators gekenmerkt door luie evaluatie, wat betekent dat ze gegevens alleen genereren of ophalen wanneer dat nodig is, in plaats van alles tegelijk in het geheugen te laden. Deze aanpak maakt ze zeer geheugenefficiënt, vooral bij het werken met grote datasets.

Bestandsobjecten als iterators

De functie open() retourneert een bestandsobject, dat een iterator is. Dit maakt het mogelijk om:

  • Regel voor regel door een bestand te itereren met een for-lus;
  • Eén regel tegelijk in het geheugen te lezen, waardoor het geschikt is voor grote bestanden (zolang individuele regels in het geheugen passen).

Als bijvoorbeeld een logbestand met 1,000,000 regels zowel INFO- als ERROR-meldingen bevat, kunnen we nog steeds het aantal ERROR-voorkomens tellen door het bestand regel voor regel te doorlopen, zelfs als het bestand niet volledig in het geheugen past (wat het geval zal zijn als we er veel meer logs aan toevoegen).

1234567891011
log_lines = [f"INFO: Log entry {i}" if i % 100 != 0 else f"ERROR: Critical issue {i}" for i in range(1, 1000001)] with open("large_log.txt", "w") as log_file: log_file.write("\n".join(log_lines)) # Process the file to count error entries error_count = 0 for line in open("large_log.txt"): if "ERROR" in line: error_count += 1 print(f"Total error entries: {error_count}")
copy

Regels in bestanden transformeren met map()

Zoals vermeld in het vorige hoofdstuk, retourneert map() een iterator die een transformatiefunctie lui toepast op elke regel in een bestand. Net als bij bestandsobjecten verwerkt map() gegevens één item tegelijk zonder alles in het geheugen te laden, waardoor het een efficiënte optie is voor het verwerken van grote bestanden.

Bijvoorbeeld: stel een bestand samen met 1000000 e-mailadressen, waarvan sommige hoofdletters bevatten. Het doel is om alle e-mails naar kleine letters om te zetten en de genormaliseerde resultaten op te slaan in een nieuw bestand ('normalized_emails.txt'). Hiervoor wordt map() gebruikt, zodat het script efficiënt blijft en geschikt is voor het verwerken van nog grotere bestanden.

12345678910111213141516171819202122
# Create a file with mixed-case email addresses email_lines = [ "John.Doe@example.com", "Jane.SMITH@domain.org", "BOB.brown@anotherexample.net", "ALICE.williams@sample.com" ] * 250000 # Repeat to simulate a large file with open("email_list.txt", "w") as email_file: email_file.write("\n".join(email_lines)) # Process the file to standardize email addresses (convert to lowercase) with open("email_list.txt") as input_file, open("normalized_emails.txt", "w") as output_file: # Use map() to convert each email to lowercase lowercase_emails = map(str.lower, input_file) for email in lowercase_emails: output_file.write(email) # Print the last email to verify the results print(email) print('Done')
copy

1. Je moet alle e-mailadressen in een bestand omzetten naar kleine letters en deze opslaan in een nieuw bestand zonder alles in het geheugen te laden. Welke aanpak is het meest efficiënt?

2. Welke van de volgende uitspraken over bestandsobjecten is correct?

question mark

Je moet alle e-mailadressen in een bestand omzetten naar kleine letters en deze opslaan in een nieuw bestand zonder alles in het geheugen te laden. Welke aanpak is het meest efficiënt?

Select the correct answer

question mark

Welke van de volgende uitspraken over bestandsobjecten is correct?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 2

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Awesome!

Completion rate improved to 7.69

bookGrote Bestanden Verwerken

Veeg om het menu te tonen

Het efficiënt verwerken van grote bestanden is essentieel bij het werken met datasets die te groot zijn om in het geheugen te passen. Python biedt hulpmiddelen zoals open() en map(), waarmee bestanden lui verwerkt kunnen worden, wat geheugen bespaart en de prestaties verbetert.

Wat zijn iterators?

Voordat we verder gaan met de open()-functie, moeten we eerst begrijpen wat een iterator is. Een iterator is een object dat een stroom van gegevens vertegenwoordigt, waarmee je één item tegelijk kunt benaderen. Iterators implementeren twee methoden:

  • __iter__(): retourneert het iterator-object zelf;
  • __next__(): retourneert het volgende item in de stroom en geeft een StopIteration-fout als er geen items meer zijn.

Stel dat we een iterator hebben genaamd iterator_object. We kunnen hierover itereren met een gewone for-lus:

for element in iterator_object:
    ...  # Process the element

In feite gebeurt het volgende onder de motorkap (de functie next() roept intern de methode __next__() van de iterator aan):

while True:
    try:
        element = next(iterator_object)
        ...  # Process the element
    except StopIteration:
        break

In tegenstelling tot standaardcollecties worden iterators gekenmerkt door luie evaluatie, wat betekent dat ze gegevens alleen genereren of ophalen wanneer dat nodig is, in plaats van alles tegelijk in het geheugen te laden. Deze aanpak maakt ze zeer geheugenefficiënt, vooral bij het werken met grote datasets.

Bestandsobjecten als iterators

De functie open() retourneert een bestandsobject, dat een iterator is. Dit maakt het mogelijk om:

  • Regel voor regel door een bestand te itereren met een for-lus;
  • Eén regel tegelijk in het geheugen te lezen, waardoor het geschikt is voor grote bestanden (zolang individuele regels in het geheugen passen).

Als bijvoorbeeld een logbestand met 1,000,000 regels zowel INFO- als ERROR-meldingen bevat, kunnen we nog steeds het aantal ERROR-voorkomens tellen door het bestand regel voor regel te doorlopen, zelfs als het bestand niet volledig in het geheugen past (wat het geval zal zijn als we er veel meer logs aan toevoegen).

1234567891011
log_lines = [f"INFO: Log entry {i}" if i % 100 != 0 else f"ERROR: Critical issue {i}" for i in range(1, 1000001)] with open("large_log.txt", "w") as log_file: log_file.write("\n".join(log_lines)) # Process the file to count error entries error_count = 0 for line in open("large_log.txt"): if "ERROR" in line: error_count += 1 print(f"Total error entries: {error_count}")
copy

Regels in bestanden transformeren met map()

Zoals vermeld in het vorige hoofdstuk, retourneert map() een iterator die een transformatiefunctie lui toepast op elke regel in een bestand. Net als bij bestandsobjecten verwerkt map() gegevens één item tegelijk zonder alles in het geheugen te laden, waardoor het een efficiënte optie is voor het verwerken van grote bestanden.

Bijvoorbeeld: stel een bestand samen met 1000000 e-mailadressen, waarvan sommige hoofdletters bevatten. Het doel is om alle e-mails naar kleine letters om te zetten en de genormaliseerde resultaten op te slaan in een nieuw bestand ('normalized_emails.txt'). Hiervoor wordt map() gebruikt, zodat het script efficiënt blijft en geschikt is voor het verwerken van nog grotere bestanden.

12345678910111213141516171819202122
# Create a file with mixed-case email addresses email_lines = [ "John.Doe@example.com", "Jane.SMITH@domain.org", "BOB.brown@anotherexample.net", "ALICE.williams@sample.com" ] * 250000 # Repeat to simulate a large file with open("email_list.txt", "w") as email_file: email_file.write("\n".join(email_lines)) # Process the file to standardize email addresses (convert to lowercase) with open("email_list.txt") as input_file, open("normalized_emails.txt", "w") as output_file: # Use map() to convert each email to lowercase lowercase_emails = map(str.lower, input_file) for email in lowercase_emails: output_file.write(email) # Print the last email to verify the results print(email) print('Done')
copy

1. Je moet alle e-mailadressen in een bestand omzetten naar kleine letters en deze opslaan in een nieuw bestand zonder alles in het geheugen te laden. Welke aanpak is het meest efficiënt?

2. Welke van de volgende uitspraken over bestandsobjecten is correct?

question mark

Je moet alle e-mailadressen in een bestand omzetten naar kleine letters en deze opslaan in een nieuw bestand zonder alles in het geheugen te laden. Welke aanpak is het meest efficiënt?

Select the correct answer

question mark

Welke van de volgende uitspraken over bestandsobjecten is correct?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 2
some-alt