Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Hantering av Stora Filer | Förbättra Prestanda med Inbyggda Verktyg
Optimeringstekniker i Python

bookHantering av Stora Filer

Effektiv hantering av stora filer är avgörande när du arbetar med dataset som är för stora för att rymmas i minnet. Python tillhandahåller verktyg som open() och map(), vilka möjliggör lat filbearbetning, vilket sparar minne och förbättrar prestandan.

Vad är iteratorer?

Innan vi går vidare med funktionen open() bör vi först förstå vad en iterator är. En iterator är ett objekt som representerar en dataström och gör det möjligt att komma åt en post i taget. Iteratorer implementerar två metoder:

  • __iter__(): returnerar själva iteratorobjektet;
  • __next__(): returnerar nästa post i strömmen och utlöser ett StopIteration-undantag när inga poster återstår.

Antag att vi har en iterator som heter iterator_object. Vi kan iterera över den med en vanlig for-loop:

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

Faktum är att följande sker i bakgrunden (funktionen next() anropar internt iteratorns metod __next__()):

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

Till skillnad från vanliga samlingar kännetecknas iteratorer av lat utvärdering, vilket innebär att de genererar eller hämtar data endast vid behov, istället för att ladda allt i minnet på en gång. Detta tillvägagångssätt gör dem mycket minnes­effektiva, särskilt vid arbete med stora dataset.

Filobjekt som iteratorer

Funktionen open() returnerar ett filobjekt, vilket är en iterator. Detta gör det möjligt att:

  • Iterera över en fil rad för rad med en for-loop;
  • Läsa in en rad åt gången i minnet, vilket gör det lämpligt för stora filer (så länge enskilda rader får plats i minnet).

Om till exempel en loggfil med 1,000,000 rader innehåller både INFO och ERROR-meddelanden, kan vi ändå räkna antalet ERROR-förekomster genom att iterera genom filen rad för rad, även om filen inte får plats helt i minnet (vilket kommer att vara fallet om vi lägger till mycket fler loggar 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

Transformera filrader med map()

Som nämnts i föregående kapitel returnerar map() en iterator och tillämpar en transformationsfunktion "lazily" på varje rad i en fil. Likt filobjekt behandlar map() data en post i taget utan att läsa in allt i minnet, vilket gör det till ett effektivt alternativ för hantering av stora filer.

Exempelvis kan en fil med 1000000 e-postadresser skapas, där vissa innehåller versaler. Målet är att konvertera alla e-postadresser till gemener och spara de normaliserade resultaten i en ny fil ('normalized_emails.txt'). Med map() kan detta uppnås, vilket säkerställer att skriptet förblir effektivt och lämpar sig för ännu 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 behöver konvertera alla e-postadresser i en fil till gemener och spara dem i en ny fil utan att läsa in allt i minnet. Vilket tillvägagångssätt är mest effektivt?

2. Vilket av följande påståenden om filobjekt är korrekt?

question mark

Du behöver konvertera alla e-postadresser i en fil till gemener och spara dem i en ny fil utan att läsa in allt i minnet. Vilket tillvägagångssätt är mest effektivt?

Select the correct answer

question mark

Vilket av följande påståenden om filobjekt är korrekt?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Awesome!

Completion rate improved to 7.69

bookHantering av Stora Filer

Svep för att visa menyn

Effektiv hantering av stora filer är avgörande när du arbetar med dataset som är för stora för att rymmas i minnet. Python tillhandahåller verktyg som open() och map(), vilka möjliggör lat filbearbetning, vilket sparar minne och förbättrar prestandan.

Vad är iteratorer?

Innan vi går vidare med funktionen open() bör vi först förstå vad en iterator är. En iterator är ett objekt som representerar en dataström och gör det möjligt att komma åt en post i taget. Iteratorer implementerar två metoder:

  • __iter__(): returnerar själva iteratorobjektet;
  • __next__(): returnerar nästa post i strömmen och utlöser ett StopIteration-undantag när inga poster återstår.

Antag att vi har en iterator som heter iterator_object. Vi kan iterera över den med en vanlig for-loop:

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

Faktum är att följande sker i bakgrunden (funktionen next() anropar internt iteratorns metod __next__()):

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

Till skillnad från vanliga samlingar kännetecknas iteratorer av lat utvärdering, vilket innebär att de genererar eller hämtar data endast vid behov, istället för att ladda allt i minnet på en gång. Detta tillvägagångssätt gör dem mycket minnes­effektiva, särskilt vid arbete med stora dataset.

Filobjekt som iteratorer

Funktionen open() returnerar ett filobjekt, vilket är en iterator. Detta gör det möjligt att:

  • Iterera över en fil rad för rad med en for-loop;
  • Läsa in en rad åt gången i minnet, vilket gör det lämpligt för stora filer (så länge enskilda rader får plats i minnet).

Om till exempel en loggfil med 1,000,000 rader innehåller både INFO och ERROR-meddelanden, kan vi ändå räkna antalet ERROR-förekomster genom att iterera genom filen rad för rad, även om filen inte får plats helt i minnet (vilket kommer att vara fallet om vi lägger till mycket fler loggar 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

Transformera filrader med map()

Som nämnts i föregående kapitel returnerar map() en iterator och tillämpar en transformationsfunktion "lazily" på varje rad i en fil. Likt filobjekt behandlar map() data en post i taget utan att läsa in allt i minnet, vilket gör det till ett effektivt alternativ för hantering av stora filer.

Exempelvis kan en fil med 1000000 e-postadresser skapas, där vissa innehåller versaler. Målet är att konvertera alla e-postadresser till gemener och spara de normaliserade resultaten i en ny fil ('normalized_emails.txt'). Med map() kan detta uppnås, vilket säkerställer att skriptet förblir effektivt och lämpar sig för ännu 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 behöver konvertera alla e-postadresser i en fil till gemener och spara dem i en ny fil utan att läsa in allt i minnet. Vilket tillvägagångssätt är mest effektivt?

2. Vilket av följande påståenden om filobjekt är korrekt?

question mark

Du behöver konvertera alla e-postadresser i en fil till gemener och spara dem i en ny fil utan att läsa in allt i minnet. Vilket tillvägagångssätt är mest effektivt?

Select the correct answer

question mark

Vilket av följande påståenden om filobjekt är korrekt?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 2
some-alt