Предостережение
Кроме того, даже если мне действительно нужен способ профилирования моей памяти, обратите внимание, что guppy
(предлагаемый профилировщик памяти Python в вышеупомянутой ссылке не поддерживает Python 3
, а альтернатива guppy3
не дает точных результатов, что приводит к таким результатам, как (см. фактические размеры ниже):
Partition of a set of 45968 objects. Total size = 5579934 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 13378 29 1225991 22 1225991 22 str
1 11483 25 843360 15 2069351 37 tuple
2 2974 6 429896 8 2499247 45 types.CodeType
Фон
Итак, у меня есть этот простой скрипт, который я использую для некоторых тестов потребления ОЗУ, читая файл двумя разными способами:
чтение файла построчно, его обработка и отбрасывание (через
generators
), что эффективно и рекомендуется практически для файлов любого размера (особенно больших файлов), работает должным образом.чтение всего файла в память (я знаю, что это не рекомендуется, однако это было только в образовательных целях).
Тестовый скрипт
import os
import psutil
import time
with open('errors.log') as file_handle:
statistics = os.stat('errors.log') # See below for contents of this file
file_size = statistics.st_size / 1024 ** 2
process = psutil.Process(os.getpid())
ram_usage_before = process.memory_info().rss / 1024 ** 2
print(f'File size: {file_size} MB')
print(F'RAM usage before opening the file: {ram_usage_before} MB')
file_handle.read() # loading whole file in memory
ram_usage_after = process.memory_info().rss / 1024 ** 2
print(F'Expected RAM usage after loading the file: {file_size + ram_usage_before} MB')
print(F'Actual RAM usage after loading the file: {ram_usage_after} MB')
# time.sleep(30)
Выход
File size: 111.75 MB
RAM usage before opening the file: 8.67578125 MB
Expected RAM usage after loading the file: 120.42578125 MB
Actual RAM usage after loading the file: 343.2109375 MB
Я также добавил 30-секундный сон для проверки awk
на уровне ОС, где я использовал следующую команду:
ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n
который дает:
...
343.176 MB python # my script
619.883 MB /Applications/PyCharm.app/Contents/MacOS/pycharm
2277.09 MB com.docker.hyperkit
Файл содержит около 800K
копий следующей строки:
[2019-09-22 16:50:17,236] ERROR in views, line 62: 404 Not Found: The
following URL: http://localhost:5000/favicon.ico was not found on the
server.
Это из-за размеров блоков или динамического распределения, когда содержимое будет загружаться блоками, и большая часть этой памяти фактически не будет использоваться?
open('errors.log', 'rb')
имеет значение. - person L3viathan   schedule 24.09.2019rb
, размер будет примерно таким же, хотя я хотел бы узнать об этом немного больше... если вы готовы к официальному ответу, я с удовольствием проголосую & принять. - person Marius Mucenicu   schedule 24.09.2019