2017-04-07 3 views
3

ich eine Funktion in Clojure Schreiben der In-Memory-Größe eines geparsten JSON zu schätzen, so etwas wie:Wie groß ist die Größe eines Clojure-Schlüsselworts?

(defn object-size 
    [object] 
    (cond 
    (sequential? object) 
     (reduce + (map object-size object)) 
    (map? object) 
     (reduce 
     (fn [total [k v]] 
      (+ total (keyword-size k) (object-size v))) 
     0 
     object) 
    :else 
     (case (type object) 
     java.lang.Long 8 
     java.lang.Double 8 
     java.lang.String (* 2 (count object)) 
     ;; other data types 
    ))) 

Offensichtlich für clojure.lang.PersistentVector, ich brauche werde java.lang.String in Gemeinkosten, etc. hinzufügen

Allerdings bin ich mir nicht sicher, wie die In-Memory-Größe einer clojure.lang.Keyword, die keyword-size-Funktion im obigen Beispiel zu finden. Wie speichert Clojure Schlüsselwörter? Sind sie konstante Größe ähnlich einer C++ enum, oder sind sie ein Spezialfall von java.lang.String, die von der Länge abhängen?

+1

Für Strings müssten Sie berücksichtigen, welche Java-Version Sie ausführen. Java 9 hat eine Optimierung für den String-Speicher AFAIK. Gute Frage anders. – nha

Antwort

3

Die Beantwortung dieser Frage aus Clojure ist grundsätzlich unmöglich. Ihre First-Draft-Funktion funktioniert in Ordnung für die sehr einfache Datenstrukturen, obwohl selbst dieser einfachste Versuch mehrere Fehler bereits hat.

Aber mehr als das ist es nur eine unklare Frage. Was ist die Größe von xs in diesem Snippet?

(def xs (let [forever (promise)] 
      (deliver forever 
        (lazy-seq (cons 1 @forever))) 
      @forever)) 

user=> (take 5 xs) 
(1 1 1 1 1) 

xs ist eine unendlich lange Sequenz (so Ihre reduzieren wird nie vollständig, aber wenn es sie sicher zurückkommen würde könnte „das ist unendlich“). Aber es benötigt tatsächlich eine kleine, feste Menge an Speicher, weil es kreisförmig ist.

Sie können sagen, gut gee das ist ein dummes Objekt, es macht mir nichts aus, wenn meine Funktion für solche Objekte fehlschlägt. Aber in einer Müll-gesammelten Sprache mit allgegenwärtiger Faulheit sind Fälle mit ähnlichen Eigenschaften alltäglich. Wenn Sie sie ausschließen, schließen Sie alles Interessante aus.

+0

Der Anwendungsfall hier ist für analysierte Statistiken JSONs von Youtube, Twitter, usw., die immer ziemlich einfach sein werden. Wir teilen diese Statistiken in Stapel für die Verarbeitung auf und müssen eine Vorstellung davon bekommen, wie groß die Stapel für eine bestimmte Heap-Größe sein können (was nicht sehr interessant ist). Ich stimme zu, dass dieser Ansatz für nichts anderes als die einfachsten Strukturen Sinn macht, aber das sind alles, wofür wir ihn brauchen. – bslawski

+1

Wenn Sie nur eine sehr grobe Schätzung für die Größe einer JSON-Struktur benötigen, nehmen Sie einfach die Größe der JSON-Zeichenfolge selbst. Wenn Sie wissen möchten, wie viele Objekte Sie für eine bestimmte Heap-Größe in den Speicher einpassen können, * probieren Sie es * mit verschiedenen Batch-Größen aus und sehen Sie, welche erfolgreich sind. Die Größe einer bestimmten Teilmenge von Elementen auf dem Heap korreliert nicht sehr sauber. – amalloy

Verwandte Themen