Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Håndtering av Store Filer | Forbedre Ytelsen med Innebygde Verktøy
Optimaliseringsteknikker i Python

bookHåndtering av Store Filer

Effektiv behandling av store filer er avgjørende når man arbeider med datasett som er for store til å få plass i minnet. Python tilbyr verktøy som open() og map(), som lar deg behandle filer på en "lat" måte, noe som sparer minne og forbedrer ytelsen.

Hva er iteratorer?

Før vi går videre med open()-funksjonen, bør vi først forstå hva en iterator er. En iterator er et objekt som representerer en datastrøm, og lar deg få tilgang til ett element om gangen. Iteratorer implementerer to metoder:

  • __iter__(): returnerer selve iteratorobjektet;
  • __next__(): returnerer neste element i strømmen og kaster et StopIteration-unntak når det ikke er flere elementer igjen.

La oss si at vi har en iterator kalt iterator_object. Vi kan iterere over den med en vanlig for-løkke:

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

Faktisk skjer følgende i bakgrunnen (funksjonen next() kaller internt på iteratorens __next__()-metode):

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

I motsetning til vanlige samlinger kjennetegnes iteratorer av lat evaluering, noe som betyr at de genererer eller henter data kun ved behov, i stedet for å laste alt inn i minnet på én gang. Denne tilnærmingen gjør dem svært minneeffektive, spesielt når man arbeider med store datasett.

Filobjekter som iteratorer

Funksjonen open() returnerer et filobjekt, som er en iterator. Dette gjør det mulig å:

  • Iterere over en fil linje for linje med en for-løkke;
  • Lese én linje om gangen inn i minnet, noe som gjør det egnet for store filer (så lenge enkeltlinjer får plass i minnet).

For eksempel, hvis en loggfil med 1,000,000 linjer inneholder både INFO- og ERROR-meldinger, kan vi fortsatt telle forekomster av ERROR ved å iterere gjennom filen linje for linje, selv om filen ikke får plass i minnet (noe som vil være tilfellet hvis vi legger til mange flere logger i den).

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

Transformere fil-linjer med map()

Som nevnt i forrige kapittel, returnerer map() en iterator, som anvender en transformasjonsfunksjon på hver linje i en fil på en lazy måte. På samme måte som filobjekter, behandler map() data ett element om gangen uten å laste alt inn i minnet, noe som gjør det til et effektivt alternativ for håndtering av store filer.

For eksempel kan man opprette en fil som inneholder 1000000 e-postadresser, hvor noen av dem har store bokstaver. Målet er å konvertere alle e-postadressene til små bokstaver og lagre de normaliserte resultatene i en ny fil ('normalized_emails.txt'). Her brukes map() for å oppnå dette, slik at skriptet forblir effektivt og egnet for behandling av enda større filer.

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. Du må konvertere alle e-postadresser i en fil til små bokstaver og lagre dem i en ny fil uten å laste alt inn i minnet. Hvilken tilnærming er mest effektiv?

2. Hvilket av følgende utsagn om filobjekter er korrekt?

question mark

Du må konvertere alle e-postadresser i en fil til små bokstaver og lagre dem i en ny fil uten å laste alt inn i minnet. Hvilken tilnærming er mest effektiv?

Select the correct answer

question mark

Hvilket av følgende utsagn om filobjekter er korrekt?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 7.69

bookHåndtering av Store Filer

Sveip for å vise menyen

Effektiv behandling av store filer er avgjørende når man arbeider med datasett som er for store til å få plass i minnet. Python tilbyr verktøy som open() og map(), som lar deg behandle filer på en "lat" måte, noe som sparer minne og forbedrer ytelsen.

Hva er iteratorer?

Før vi går videre med open()-funksjonen, bør vi først forstå hva en iterator er. En iterator er et objekt som representerer en datastrøm, og lar deg få tilgang til ett element om gangen. Iteratorer implementerer to metoder:

  • __iter__(): returnerer selve iteratorobjektet;
  • __next__(): returnerer neste element i strømmen og kaster et StopIteration-unntak når det ikke er flere elementer igjen.

La oss si at vi har en iterator kalt iterator_object. Vi kan iterere over den med en vanlig for-løkke:

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

Faktisk skjer følgende i bakgrunnen (funksjonen next() kaller internt på iteratorens __next__()-metode):

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

I motsetning til vanlige samlinger kjennetegnes iteratorer av lat evaluering, noe som betyr at de genererer eller henter data kun ved behov, i stedet for å laste alt inn i minnet på én gang. Denne tilnærmingen gjør dem svært minneeffektive, spesielt når man arbeider med store datasett.

Filobjekter som iteratorer

Funksjonen open() returnerer et filobjekt, som er en iterator. Dette gjør det mulig å:

  • Iterere over en fil linje for linje med en for-løkke;
  • Lese én linje om gangen inn i minnet, noe som gjør det egnet for store filer (så lenge enkeltlinjer får plass i minnet).

For eksempel, hvis en loggfil med 1,000,000 linjer inneholder både INFO- og ERROR-meldinger, kan vi fortsatt telle forekomster av ERROR ved å iterere gjennom filen linje for linje, selv om filen ikke får plass i minnet (noe som vil være tilfellet hvis vi legger til mange flere logger i den).

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

Transformere fil-linjer med map()

Som nevnt i forrige kapittel, returnerer map() en iterator, som anvender en transformasjonsfunksjon på hver linje i en fil på en lazy måte. På samme måte som filobjekter, behandler map() data ett element om gangen uten å laste alt inn i minnet, noe som gjør det til et effektivt alternativ for håndtering av store filer.

For eksempel kan man opprette en fil som inneholder 1000000 e-postadresser, hvor noen av dem har store bokstaver. Målet er å konvertere alle e-postadressene til små bokstaver og lagre de normaliserte resultatene i en ny fil ('normalized_emails.txt'). Her brukes map() for å oppnå dette, slik at skriptet forblir effektivt og egnet for behandling av enda større filer.

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. Du må konvertere alle e-postadresser i en fil til små bokstaver og lagre dem i en ny fil uten å laste alt inn i minnet. Hvilken tilnærming er mest effektiv?

2. Hvilket av følgende utsagn om filobjekter er korrekt?

question mark

Du må konvertere alle e-postadresser i en fil til små bokstaver og lagre dem i en ny fil uten å laste alt inn i minnet. Hvilken tilnærming er mest effektiv?

Select the correct answer

question mark

Hvilket av følgende utsagn om filobjekter er korrekt?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 2
some-alt