środa, marca 01, 2023

GZIPem w plika z pomocą ChatGPT ;-)

ChatGPT to takie miss and hit ;-) ale w sprawach związanych z programowaniem bywa bardzo przydatny.

W pracy mam tak, że mam bardzo dużo danych w JSONie, tak przeciętnie koło 7.5 GB na katalog.
W macOS nie ma przezroczystej kompresji folderów więc jest problem z szybkim znikaniem dysku.

Ja te pliki zwykle przetwarzam jakimś Pythonem.... więc wpadłem na pomysł, że jakby były potraktowane GZIPem... 44 tysiące plików ważące 7.5 GB stają się 300-400 MB w 44 tysiącach plików ;-) (z różnych powodów chcę by to były oddzielne pliki, ale po prostu mniejsze).

No i nie chciało mi się tego ręcznie zrobić, więc dałem ChatGPT prompta, napisz w Pythonie program, który przeleci przez podfoldery aktualnego folderu i jeśli w podfolderze jest więcej niż 500 plików to skompresuje każdy z tych plików GZIPem, nie kompresuj już skompresowanych plików ;-)

Po jakimś czasie poprosiłem jeszcze by zrobił to na wielu wątkach.

No i stworzył mi coś takiego:

import os
import gzip
import concurrent.futures

def compress_file(file_path):
if not file_path.endswith('.gz'):
print(f"Compressing file {file_path}...")
with open(file_path, 'rb') as f_in:
with gzip.open(f"{file_path}.gz", 'wb') as f_out:
f_out.write(f_in.read())
os.remove(file_path)
else:
print(f"File {file_path} is already compressed in GZIP format and will not be compressed again.")

def compress_files_in_folder(path):
file_count = len([f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))])
if file_count > 500:
print(f"Compressing files in directory {path}...")
with concurrent.futures.ThreadPoolExecutor() as executor:
for filename in os.listdir(path):
file_path = os.path.join(path, filename)
executor.submit(compress_file, file_path)
else:
print(f"The number of files in directory {path} is less than 500.")

def process_folders():
root_path = os.getcwd()
with concurrent.futures.ThreadPoolExecutor() as executor:
for dirpath, dirnames, filenames in os.walk(root_path):
executor.submit(compress_files_in_folder, dirpath)

process_folders()


Działa to całkiem rozsądnie :-) z 70 GB wolnego miejsca mam znów na dysku firmowego Macbooka 230 GB :-)
Mam też drugi programik, który robi odwrotną robotę:
import os
import gzip

def decompress_file(file_path):
if file_path.endswith('.gz'):
print(f"Decompressing file {file_path}...")
with gzip.open(file_path, 'rb') as f_in:
with open(file_path[:-3], 'wb') as f_out:
f_out.write(f_in.read())
os.remove(file_path)
else:
print(f"File {file_path} is not in GZIP format and will not be decompressed.")

def decompress_files_in_folder(path):
print(f"Decompressing files in directory {path}...")
for filename in os.listdir(path):
file_path = os.path.join(path, filename)
decompress_file(file_path)

def process_folders():
root_path = os.getcwd()
for dirpath, dirnames, filenames in os.walk(root_path):
decompress_files_in_folder(dirpath)

process_folders()


Ale też poprosiłem o napisanie mi kawałka kodu, który pozwoli moim narzędziom ładować te JSONy do pamięci niezależnie czy to jest GZIP czy nie ;-)
I takie coś zaproponował:
import json
import gzip

def load(file_path):
if file_path.endswith('.gz'):
with gzip.open(file_path, 'rb') as f:
file_content = f.read()
else:
with open(file_path, 'r') as f:
file_content = f.read()
return json.loads(file_content)


Niby to nie jest rocket science, ale zamiast to pisać samemu, zrobił to za mnie ;-)

Chocaż przyznaję, że nie sprawdziłem jeszcze tego do dekompresji ;-)



Podobne postybeta
GZIP mi oddał 119 GB dysku ;-)
Odzyskać trochę miejsca na dysku... w macOS ;-)
Mistral czeka na książkę
Żenienie Todoist z Obsidian przy pomocy Pythona ;-)
Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)

Brak komentarzy:

Prześlij komentarz