Файл Python открывается/закрывается каждый раз, пока он не будет открыт до завершения процесса
У меня около 50 ГБ текстового файла, и я проверяю первые несколько символов каждой строки и записываю их в другие файлы, указанные для этого начального текста.
Например.
мой вход содержит:
cow_ilovecow
dog_whreismydog
cat_thatcatshouldgotoreddit
dog_gotitfromshelter
...............
Итак, я хочу обработать их в категориях коров, собак и кошек (около 200)
поэтому
if writeflag==1:
writefile1=open(writefile,"a") #writefile is somedir/dog.txt....
writefile1.write(remline+"\n")
#writefile1.close()
Итак, что лучше всего, я должен закрыть? В противном случае, если я держу его открытым, writefile1=open(writefile,"a")
поступает правильно?
Ответы
Ответ 1
Вы должны обязательно попытаться открыть/закрыть файл как можно меньше
Потому что даже по сравнению с чтением/записью файла, открытие/закрытие файла намного дороже
Рассмотрим два блока кода:
f=open('test1.txt', 'w')
for i in range(1000):
f.write('\n')
f.close()
а также
for i in range(1000):
f=open('test2.txt', 'a')
f.write('\n')
f.close()
Первый занимает 0,025 с, второй - 0,309 с
Ответ 2
Используйте оператор with
, он автоматически закрывает файлы для вас, выполняет все операции внутри блока with
, поэтому он будет держать файлы открытыми для вас и закроет файлы, как только вы выйдете из блок with
.
with open(inputfile)as f1, open('dog.txt','a') as f2,open('cat.txt') as f3:
#do something here
EDIT:
Если вы знаете все возможные имена файлов, которые будут использоваться до компиляции вашего кода, то использование with
является лучшим вариантом, и если вы этого не сделаете, вы должны использовать свой подход, но вместо закрытия файла вы можете flush
данных к файлу с помощью writefile1.flush()
Ответ 3
Держите его открытым все время! В противном случае вы сообщаете системе, что вы все время пишете, и может решить сбросить ее на диск, а не буферизировать. И по очевидным причинам n записи на диске намного дороже, чем 1 запись на диск.
Если вы хотите добавить в файл и не перезаписать его, тогда да, a
- правильный режим.
Ответ 4
Операции ввода-вывода потребляют слишком много времени. Откройте и закройте файл.
Это намного быстрее, если вы открываете оба файла (вход и выход), используйте буфер памяти, допустим, размер 10 МБ для вашей текстовой обработки, а затем записывайте это в выходной файл. Например:
file = {} # just initializing dicts
filename = {}
with open(file) as f:
file['dog'] = None
buffer = ''
...
#maybe there is a loop here
if writeflag:
if file['dog'] == None:
file['dog'] = open(filename['dog'], 'a')
buffer += remline + '\n'
if len(buffer) > 1024*1000*10: # 10MB of text
files['dog'].write(buffer)
buffer = ''
for v in files.values():
v.close()