Ich versuche, eine DynamoDB-JSON-Datei mit Polars zu reduzieren.
Meine JSON-Datei ist 1 GB groß, 100 Monate nach der Komprimierung in gz, aber im Speicher, wenn ich sie lese, belegt sie 16 GB.
Da die Daten aus DynamoDB stammen, können meine Spalten mehrere Typen haben. Vor einem Jahr war es zum Beispiel ein String, heute ist es ein Boolescher Wert.
Also habe ich 4 Experimente mit nur einem pl.read_ndjson und write_parquet gemacht:
Lesen Sie eine ~150 MB JSON-Datei mit 1 verschachtelten Ebene, alle Zeilen haben dasselbe Schema -> ~390 MB verwendeter Speicher
Lesen Sie dieselbe Datei, komprimiert mit gz -> ~750 MB belegter Speicher
Lesen Sie eine ~150 MB JSON-Datei mit mehreren verschachtelten Ebenen und unterschiedlichen Schemata -> 7,7 GB belegter Speicher
Lesen Sie dieselbe Datei, komprimiert mit gz -> ~7,7 GB belegter Speicher
Warum braucht es so viel Speicher, wenn das Schema in der verschachtelten Datei nicht konstant ist?
Hier mein Skript für einfache Daten:
Ich versuche, eine DynamoDB-JSON-Datei mit Polars zu reduzieren. Meine JSON-Datei ist 1 GB groß, 100 Monate nach der Komprimierung in gz, aber im Speicher, wenn ich sie lese, belegt sie 16 GB. Da die Daten aus DynamoDB stammen, können meine Spalten mehrere Typen haben. Vor einem Jahr war es zum Beispiel ein String, heute ist es ein Boolescher Wert. Also habe ich 4 Experimente mit nur einem pl.read_ndjson und write_parquet gemacht: [list] [*]Lesen Sie eine ~150 MB JSON-Datei mit 1 verschachtelten Ebene, alle Zeilen haben dasselbe Schema -> ~390 MB verwendeter Speicher [*]Lesen Sie dieselbe Datei, komprimiert mit gz -> ~750 MB belegter Speicher [*]Lesen Sie eine ~150 MB JSON-Datei mit mehreren verschachtelten Ebenen und unterschiedlichen Schemata -> 7,7 GB belegter Speicher [*]Lesen Sie dieselbe Datei, komprimiert mit gz -> ~7,7 GB belegter Speicher [/list] [b]Warum braucht es so viel Speicher, wenn das Schema in der verschachtelten Datei nicht konstant ist?[/b] Hier mein Skript für einfache Daten: [code]import json import random from uuid import uuid4 from datetime import datetime
DYNAMO_TYPES = ["S", "N", "BOOL"]
def random_dynamodb_value(i, depth=0): if depth > 0: return {"S": str(uuid4())}
def generate_extra_easy_fields(n=50): extra = {} for i in range(n): field_name = f"field_{i}" extra[field_name] = random_dynamodb_value(i) return extra
base.update(generate_extra_easy_fields(50)) return base
def generate_simple_jsonl_file(filename: str, n: int = 20): with open(filename, "w") as f: for i in range(n): entry = json.dumps(generate_easy_entry()) f.write(entry + "\n") [/code] Hier mein Skript für komplexe Daten: [code]import json import random from uuid import uuid4 from datetime import datetime
DYNAMO_TYPES = ["S", "N", "BOOL", "M", "L"]
def random_dynamodb_value(i, depth=0): if depth > 2: return {"S": str(uuid4())}
def generate_extra_fields(n=50): extra = {} for i in range(n): field_name = f"field_{i}" extra[field_name] = random_dynamodb_value(i) return extra
def generate_entry(): base = { "id": {"S": str(uuid4())}, "timestamp": {"S": datetime.now().isoformat()}, "meta": {"M": {"level1": {"M": {"level2": {"M": {"level3": {"L": [random_dynamodb_value(3) for _ in range(2)]}}}}}}}, "listOfStructs": { "L": [ { "M": { "subId": {"N": str(i)}, "flag": {"BOOL": random.choice([True, False])} } } for i in range(random.randint(2, 4)) ] }, "structOfStructOfStruct": {"M": {"a": {"M": {"b": {"M": {"c": random_dynamodb_value(2)}}}}}}, "structOfStructOfList": {"M": {"outer": {"M": {"innerList": {"L": [random_dynamodb_value(2) for _ in range(3)]}}}}}, "multiTypeField": generate_multitype_field() }
base.update(generate_extra_fields(50)) return base
def generate_complexe_jsonl_file(filename: str, n: int = 20): with open(filename, "w") as f: for i in range(n): entry = json.dumps(generate_entry()) f.write(entry + "\n") [/code] Der Code zum Ausführen von Experimenten (wählen Sie Ihr Szenario): [code]import os
import polars as pl import psutil
from generate_complexe_data import generate_complexe_jsonl_file from generate_simple_data import generate_simple_jsonl_file
Ich habe Python 3.7 + OpenPyxl verwendet, um generierte Diagramme zu erzeugen. Es funktioniert gut. verwendete eine höhere Ausgabe von Python (3,8+) + OpenPyxl für generierte Diagramme , Es...
Wenn ich eine Liste von Dateien habe, l = mit den Größen S1, S2, ..., Sn und ich erstelle einen df mit df = pl.scan_csv (l, ...) oder df = pl.Scan_Parquet (l, l. d.h. ?
Ich habe Probleme beim Verständnis von Python-Async-Generatoren. class AsyncAWSService:
def __init__(self, name: typing.Literal ):
self.session = aioboto3.Session()
self.service_name: typing.Literal...
Ich habe eine C#/. Net -Web -App, die auf AWS gehostet wird. Ich versuche, eine Funktion hinzuzufügen, in der ein Kunde seine Telefonnummer eingibt und ein Code, um ein kostenloses Produkt zu...
Ich komme aus einem Android -Anwendungshintergrund. Ich erforsche DynamoDB und habe einen Kotlin -Server geschrieben und ihn mit DynamoDB verknüpft. Während ich erfolgreich Verbindung, Tabelle,...