Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 救命啊!检索网页时,我无法使用内存_Java_Clojure_Buffer - Fatal编程技术网

Java 救命啊!检索网页时,我无法使用内存

Java 救命啊!检索网页时,我无法使用内存,java,clojure,buffer,Java,Clojure,Buffer,我正在从网上检索HTML。我得到“java.lang.OutOfMemoryError:java堆空间(repl-1:3)” 我认为问题在于“应用str”。有没有更简单的方法 将缓冲读取器转换为字符串 或者检索网页 编辑:我需要检索 你说的“太慢”是什么意思?我无法想象语言会有多重要,因为这里的瓶颈是互联网。你说的“太慢”是什么意思?我无法想象语言会有多重要,因为这里的瓶颈是互联网。堆的当前大小是多少?可以使用JVM参数通过-X arg指定更多堆空间 有关更多信息,请参阅。如果您有更多的时间

我正在从网上检索HTML。我得到“
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中构建大字符串的更好方法。

Yikes
line seq
将为每行创建一个
String
对象,然后将其连接并丢弃,这将是一个缓慢而痛苦的过程。像这样使用
apply
会将所有这些字符串放入一个巨大的列表中,并调用
str
,这也会很痛苦

请尝试以下方法:

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

slurp*
使用一种在Java中构建大字符串的更好方法。

有两种可能性:

  • 您正在获取的内容的大小占可用堆空间的很大一部分,并且在读取/连接过程中,您的算法需要工作存储器中的大小为2到3倍。在这种情况下,增加堆空间是一种合理的解决方法

  • 该算法实际上是使用O(N^2)空间使用
    apply
    进行级联。不难想象,
    apply
    的实现是递归的,clojure编译器/JIT编译器正在生成大量引用中间字符串的递归代码。在这种情况下,增加堆空间是一个糟糕的解决方法


  • 不管是哪种方式,我都会先用一个更有效的替代方案来替换
    (apply str(line seq buffer))
    (参见@Brian的答案和我对@tomjen答案的评论)。。。如果堆的使用仍然是一个问题,那么只需要担心它。(我想不会的。)

    有两种可能性:

  • 您正在获取的内容的大小占可用堆空间的很大一部分,并且在读取/连接过程中,您的算法需要工作存储器中的大小为2到3倍。在这种情况下,增加堆空间是一种合理的解决方法

  • 该算法实际上是使用O(N^2)空间使用
    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”。。。我就是打不出来:-)