2009-06-27 9 views
11

Javaでは、ファイル全体をバイト配列に読み込み、何らかの処理を行います。今私はclojureで同じアルゴリズムを実装したいと思います。バイト配列を表すClojure

私は配列の代わりにリストを使うことができますか?

私はclojureから配列を作成できますが、これを処理するlispの方法は何ですか?

答えて

11

問題のファイルが非常に大きい場合は、常にメモリマップファイルの使用を検討する必要があります。 clojure.contrib.mmapはそれに対処するいくつかの機能を提供しています。

私はclojureから配列を作成できますが、これを処理する方法は何ですか?

私はLispの方法についてはわかりませんが、Clojureの方法では配列の配列関数を使うことができますので、効率的な表現と快適な操作の間で決める必要はありません。 Clojureを実用的にする点の1つ)。

+0

私が読む予定のファイルは小さいです。 200〜300 Kbの最大値 –

+0

それから、Javaの場合と同じように配列を作成し、配列で魔法のように動作するseqableを受け入れるClojureの関数を使用します。それ以上の助言が必要な場合は、コンテンツと正確に何が関係があるかを述べることができます。バイト配列を使用しているので、私はバイナリを使う必要があると仮定しています。その場合は、次の記事を参考にしてください。http://gnuvince.wordpress.com/ 2009/01/29/reading-binary-data-in-clojure / – pmf

3

ここでは、ファイル内のバイトのレイジーシーケンスがあり、最後のバイトが読み込まれたときにファイルハンドルがクローズされます。巨大なファイルで処理されたシーケンスを扱う場合は、シーケンスの先頭を押さないように注意してください。そうしないと、メモリが足りなくなります。エラー状態で手動で閉じなければならない場合に備えて、ファイルハンドルを保持しても問題ありません。

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