Как chatgpt-5 помог мне пофиксить утечку памяти
Мой вопрос начался с осознания того, что ram почему-то забивается спустя 10 минут работы на сервере
chatgpt ответила так и предложила этот код, чтобы посмотреть происходит ли в этом месте утечка
import plutus
import os
import psutil
import time
# Преобразуем hex приватник в публичный, потом в адрес — в цикле
def memory_test(iterations=500000, use_fastecdsa=True):
process = psutil.Process(os.getpid())
start_mem = process.memory_info().rss
print(f"[START] RAM: {start_mem / 1024 / 1024:.2f} MB")
priv_key = "1" * 64 # фиктивный приватник для теста
for i in range(iterations):
pubkey = plutus.private_key_to_public_key(priv_key, use_fastecdsa)
addr = plutus.public_key_to_address(pubkey)
if i % 50000 == 0 and i > 0:
mem_now = process.memory_info().rss
print(f"[{i}] RAM: {mem_now / 1024 / 1024:.2f} MB")
end_mem = process.memory_info().rss
print(f"[END] RAM: {end_mem / 1024 / 1024:.2f} MB")
print(f"Δ RAM: {(end_mem - start_mem) / 1024 / 1024:.2f} MB")
if __name__ == "__main__":
# Сначала тестируем с fastecdsa
print("\n--- Testing fastecdsa=True ---")
memory_test(iterations=200000, use_fastecdsa=True)
# Потом без fastecdsa
print("\n--- Testing fastecdsa=False ---")
memory_test(iterations=200000, use_fastecdsa=False)
По итогу оказалось что да, происходит
Результаты теста:
Chatgpt затем предложила потестить нативную реализацию алгоритма ecsda, которую она написала сама:
import os
import psutil
from ecdsa import SigningKey, SECP256k1
def private_key_to_public_key_py(private_key_hex: str) -> str:
sk = SigningKey.from_string(bytes.fromhex(private_key_hex), curve=SECP256k1)
vk = sk.verifying_key
x = vk.pubkey.point.x()
y = vk.pubkey.point.y()
return f"04{x:064x}{y:064x}"
def memory_test(iterations=200000):
process = psutil.Process(os.getpid())
start_mem = process.memory_info().rss
print(f"[START] RAM: {start_mem / 1024 / 1024:.2f} MB")
priv_key = "1" * 64
for i in range(iterations):
pubkey = private_key_to_public_key_py(priv_key)
# можно оставить address генерацию для полноты:
# addr = plutus.public_key_to_address(pubkey)
if i % 50000 == 0 and i > 0:
mem_now = process.memory_info().rss
print(f"[{i}] RAM: {mem_now / 1024 / 1024:.2f} MB")
end_mem = process.memory_info().rss
print(f"[END] RAM: {end_mem / 1024 / 1024:.2f} MB")
print(f"Δ RAM: {(end_mem - start_mem) / 1024 / 1024:.2f} MB")
if __name__ == "__main__":
memory_test()
И вот он, результат 😎
9 комментариев