Java 救命啊!检索网页时,我无法使用内存
我正在从网上检索HTML。我得到“Java 救命啊!检索网页时,我无法使用内存,java,clojure,buffer,Java,Clojure,Buffer,我正在从网上检索HTML。我得到“java.lang.OutOfMemoryError:java堆空间(repl-1:3)” 我认为问题在于“应用str”。有没有更简单的方法 将缓冲读取器转换为字符串 或者检索网页 编辑:我需要检索 你说的“太慢”是什么意思?我无法想象语言会有多重要,因为这里的瓶颈是互联网。你说的“太慢”是什么意思?我无法想象语言会有多重要,因为这里的瓶颈是互联网。堆的当前大小是多少?可以使用JVM参数通过-X arg指定更多堆空间 有关更多信息,请参阅。如果您有更多的时间
java.lang.OutOfMemoryError:java堆空间(repl-1:3)”
我认为问题在于“应用str”。有没有更简单的方法
- 将缓冲读取器转换为字符串
- 或者检索网页
你说的“太慢”是什么意思?我无法想象语言会有多重要,因为这里的瓶颈是互联网。你说的“太慢”是什么意思?我无法想象语言会有多重要,因为这里的瓶颈是互联网。堆的当前大小是多少?可以使用JVM参数通过-X arg指定更多堆空间
有关更多信息,请参阅。如果您有更多的时间,请尝试使用Java探查器查看应用程序内存不足的原因。虽然可以调整堆空间大小,但这是一个临时解决方案。堆的当前大小是多少?可以使用JVM参数通过-X arg指定更多堆空间
有关更多信息,请参阅。如果您有更多的时间,请尝试使用Java探查器查看应用程序内存不足的原因。虽然您可以调整堆空间的大小,但这是一个临时解决方案。Yikes
line seq
将为每行创建一个String
对象,然后将其连接并丢弃,这将是一个缓慢而痛苦的过程。像这样使用apply
会将所有这些字符串放入一个巨大的列表中,并调用str
,这也会很痛苦
请尝试以下方法:
(use 'clojure.contrib.duck-streams) ;SO's syntax highlighting sucks
(slurp* (reader url))
slurp*
使用一种在Java中构建大字符串的更好方法。Yikesline seq
将为每行创建一个String
对象,然后将其连接并丢弃,这将是一个缓慢而痛苦的过程。像这样使用apply
会将所有这些字符串放入一个巨大的列表中,并调用str
,这也会很痛苦
请尝试以下方法:
(use 'clojure.contrib.duck-streams) ;SO's syntax highlighting sucks
(slurp* (reader url))
slurp*
使用一种在Java中构建大字符串的更好方法。有两种可能性:
apply
进行级联。不难想象,apply
的实现是递归的,clojure编译器/JIT编译器正在生成大量引用中间字符串的递归代码。在这种情况下,增加堆空间是一个糟糕的解决方法不管是哪种方式,我都会先用一个更有效的替代方案来替换
(apply str(line seq buffer))
(参见@Brian的答案和我对@tomjen答案的评论)。。。如果堆的使用仍然是一个问题,那么只需要担心它。(我想不会的。)有两种可能性:
apply
进行级联。不难想象,apply
的实现是递归的,clojure编译器/JIT编译器正在生成大量引用中间字符串的递归代码。在这种情况下,增加堆空间是一个糟糕的解决方法不管是哪种方式,我都会先用一个更有效的替代方案来替换
(apply str(line seq buffer))
(参见@Brian的答案和我对@tomjen答案的评论)。。。如果堆的使用仍然是一个问题,那么只需要担心它。(我想不会的。)是否有理由将此部分放在clojure而不是Java中?我的整个项目都放在clojure中。谢谢。我在多个项目中使用了完全相同的代码来获取内容,这并不慢。你说的慢是什么意思?获取某些页面需要10秒吗?很抱歉,我获取了java.lang.OutOfMemoryError:java堆空间(repl-1:3)是否有理由将此部分放在clojure而不是java中?我的整个项目都在clojure中。谢谢。我在多个项目中使用了完全相同的代码来获取内容,这并不慢。你说的慢是什么意思?获取一些页面需要10秒吗?很抱歉,我得到了java.lang.OutOfMemoryError:java堆空间(repl-1:3)很抱歉,我得到了java.lang.OutOfMemoryError:java堆空间(repl-1:3)@tomjen:N如果将平均长度为M的N个字符串的列表串联起来,将复制O(NNM)个字节。相比之下,下载需要复制O(N*M)字节。现在,比例常数很重要,但是对于足够大的N,字符串连接将花费比下载更长的时间。这是一个算法问题。。。不是语言问题。另外,我会拼写“Naiver”。。。我只是无法键入:-)很抱歉,我得到了java.lang.OutOfMemoryError:java堆空间(repl-1:3)@tomjen:N如果将平均长度为M的N个字符串的列表串联起来,将复制O(NNM)个字节。相比之下,下载需要复制O(N*M)字节。现在,比例常数很重要,但是对于足够大的N,字符串连接将花费比下载更长的时间。这是一个算法问题。。。不是语言问题。另外,我会拼写“Naiver”。。。我就是打不出来:-)