unj*_*nj2 1 java buffer clojure
我正在从网上检索HTML.我得到"java.lang.OutOfMemoryError: Java heap space (repl-1:3)"
;; fetch: URL -> String
;; fetch returns the string of the HTML url
(defn fetch [url]
(with-open [stream (. url openStream)]
(let [buffer (BufferedReader. (InputStreamReader. stream))]
(apply str (line-seq buffer)))))
Run Code Online (Sandbox Code Playgroud)
我认为问题是"应用str".有没有更简单的方法
编辑:我需要检索
让人惊讶. line-seq
将String
每行创建一个对象,然后最终连接并丢弃,这将是缓慢而痛苦的.使用apply
这样就可以将所有这些字符串放入一个巨大的列表并调用str
它,这也将是痛苦的.
试试这个:
(use 'clojure.contrib.duck-streams) ;SO's syntax highlighting sucks
(slurp* (reader url))
Run Code Online (Sandbox Code Playgroud)
slurp*
使用一个StringBuilder
更好的方法来在Java中构建一个大字符串.