Как наиболее эффективно использовать вычислительные ресурсы при чтении из одного файла и записи в другой? построчно или в пакете к списку? - PullRequest
1 голос
/ 22 февраля 2020

Я читаю построчно из текстового файла и манипулирую строкой, чтобы затем записать ее в CSV-файл.

Я могу придумать два лучших способа сделать это (и я приветствую другие идеи или модификации):

  1. Чтение, обработка одной строки в списке и go прямо на запись строки.
linelist = []

with open('dirty.txt', 'r') as dirty_text:
   with open('clean.csv', 'w') as clean_csv:
      cleancsv_writer = csv.writer(clean_csv, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
         for line in dirty_text:
            #Parse fields into list, replacing the previous list item with a new string that is a comma-separated row.
            #Write list item into clean.csv.
Считать и обработать строки в список (до достижения предела размера списка), затем записать список в CSV в один большой пакет. Повторяйте до конца файла (но я опускаю l oop для этого примера).
linelist = []
seekpos = 0

with open('dirty.txt', 'r') as dirty_text:
   for line in dirty_text:
      #Parse fields into list until the end of the file or the end of the list's memory space, such that each list item is a string that is a comma-separated row.
      #update seek position to come back to after this batch, if looping through multiple batches

with open('clean.csv', 'a') as clean_csv:
   cleancsv_writer = csv.writer(clean_csv, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
      #write list into clean.csv, each list item becoming a comma-separated row.

#This would likely be a loop for bigger files, but for my project and for simplicity, it's not necessary.

Какой процесс наиболее эффективно использует ресурсы?

В этом случае я предполагаю, что никому (человеку или кому-либо еще) не нужен доступ к какому-либо файлу во время этого процесса (хотя я бы с удовольствием услышал обсуждение эффективности в этом случае).

Я также предполагаю, что список требует меньше ресурсов, чем в словаре.

Моя основная задача - использование памяти. Я догадываюсь, что первый процесс использует наименьшее количество памяти, потому что список никогда не становится длиннее, чем один элемент, поэтому максимальная память, которую он использует в любой данный момент, меньше, чем у второго процесса, который максимально использует память списка. Но я не уверен, как динамическое распределение памяти c работает в Python, и у вас есть два файловых объекта, открытых одновременно в первом процессе.

Что касается энергопотребления и общего времени занимает, я не уверен, какой процесс является более эффективным. Я догадываюсь, что с несколькими пакетами второй вариант потребляет больше энергии и занимает больше времени, потому что он открывает и закрывает файлы в каждом пакете.

Что касается сложности и длины кода, то первый вариант выглядит так, как будто он будет получается проще и короче.

Другие соображения?

Какой процесс лучше?

Есть ли лучший способ? Десять лучших способов?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 22 февраля 2020

Чтение всех данных в память неэффективно, поскольку использует больше памяти, чем необходимо.

Вы можете обменять некоторый ЦП на память; программа для чтения всего в память будет иметь один очень простой основной цикл; но основным узким местом будет канал ввода-вывода, поэтому он действительно не будет быстрее. Независимо от того, насколько быстро работает код, любая разумная реализация будет тратить большую часть времени на ожидание диска.

Если у вас достаточно памяти, чтение всего файла в память будет работать нормально. Как только объем данных превысит объем доступной памяти, производительность будет ухудшаться незаметно (т. Е. ОС начнет выгружать области памяти на диск, а затем подкачать их обратно, когда они понадобятся снова; в худшем случае это в основном приведет к перебоям в работе системы). чтобы остановить, ситуация называется порка). Основная причина, по которой вы предпочитаете читать и писать строки одновременно, заключается в том, что программа будет работать без ухудшения качества даже при увеличении объема данных.

2 голосов
/ 22 февраля 2020

I / O уже буферизован; просто напишите то, что выглядит естественным, и пусть файловые объекты и операционная система позаботятся о фактическом чтении и записи на диск.

with open('dirty.txt', 'r') as dirty_text:
    with open('clean.csv', 'w') as clean_csv:
        cleancsv_writer = csv.writer(clean_csv, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        for line in dirty_text:
            row = some_function(line)
            cleancsv_writer.writerow(row)

Если вся работа по очистке строки абстрагируется some_function, вам даже не нужны for l oop.

with open('dirty.txt', 'r') as dirty_text,\
    with open('clean.csv', 'w') as clean_csv:
        cleancsv_writer = csv.writer(clean_csv, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        cleancsv_writer.writerows(some_function(line) for line in dirty_text))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...