11 Stimmen

Clojure stellt ein Byte-Array dar

In Java würde ich die gesamte Datei in ein Byte-Array einlesen und damit einige Verarbeitungen durchführen. Jetzt möchte ich den gleichen Algorithmus in Clojure implementieren.

Was mich interessiert ist, ob ich anstelle eines Arrays eine Liste verwenden kann?

Ich weiß, dass ich ein Array in Clojure erstellen kann, aber wie wird dies auf Lisp-Art behandelt?

11voto

pmf Punkte 7438

Wenn die betreffende Datei sehr groß ist, sollten Sie immer erwägen, eine im Arbeitsspeicher abgebildete Datei zu verwenden. clojure.contrib.mmap bietet einige Funktionen, um damit umzugehen.

Ich weiß, dass ich mit Clojure ein Array erstellen kann, aber wie wird dies auf Lisp-Weise gehandhabt?

Ich kenne den Lisp-Weg nicht, aber auf die Clojure-Weise können Sie die Sequenzfunktionen auf Arrays verwenden, sodass Sie nicht zwischen effizienter Repräsentation und komfortabler Handhabung wählen müssen (was meiner Meinung nach einer der Punkte ist, die Clojure so pragmatisch machen).

0 Stimmen

Dann erstellen Sie einfach das Array wie in Java und verwenden Sie Clojures Funktionen, die eine Sequenz akzeptieren, die magischerweise mit Arrays funktionieren. Für weitere Ratschläge könnten Sie erwähnen, was genau Sie mit dem Inhalt tun müssen. Da Sie ein Byte-Array verwenden, gehe ich davon aus, dass Sie binäre Operationen durchführen müssen, in diesem Fall möchten Sie vielleicht den folgenden Artikel lesen, der einige interessante Muster zur Verwendung zeigt: gnuvince.wordpress.com/2009/01/29/…

3voto

Arthur Ulfeldt Punkte 89086

Hier ist eine träge Sequenz der Bytes in der Datei und schließt den Datei-Handle, wenn das letzte Byte gelesen wurde. Wenn Sie mit Sequenzen arbeiten, die von riesigen Dateien bereitgestellt werden, achten Sie darauf, nicht den Anfang der Sequenz irgendwo festzuhalten, sonst wird Ihnen der Speicher ausgehen. Es ist jedoch in Ordnung, den Datei-Handle festzuhalten, falls Sie ihn manuell in einem Fehlerfall schließen müssen.

(defn byte-seq \[rdr\]
  (let \[result (. rdr read)\]
    (if (= result -1)
      (do (. rdr close) nil)
      (lazy-seq (cons result (byte-seq rdr))))))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X