救命!我在检索网页时获得了OutofMemory

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".有没有更简单的方法

  • 将缓冲的阅读器转换为字符串?
  • 或检索网页?

编辑:我需要检索

http://fiji4.ccs.neu.edu/~zerg/lemurcgi/lemur.cgi?g=p&v=or&v=measures&v=being&v=taken&v=against,&v=corrupt&v=public&v=officials&v=of&v=any&v=governmental&v=jurisdiction&v =全世界.

Bri*_*per 6

让人惊讶. line-seqString每行创建一个对象,然后最终连接并丢弃,这将是缓慢而痛苦的.使用apply这样就可以将所有这些字符串放入一个巨大的列表并调用str它,这也将是痛苦的.

试试这个:

(use 'clojure.contrib.duck-streams)  ;SO's syntax highlighting sucks
(slurp* (reader url))
Run Code Online (Sandbox Code Playgroud)

slurp*使用一个StringBuilder更好的方法来在Java中构建一个大字符串.