2009-10-05 7 views
1

나는 웹에서 HTML을 가져오고있다. 나는.Help! 나는 웹 페이지를 가져 오는 동안 OutofMemory를 얻는다.

  • 에 쉬운 방법은? 문자열로
  • 를 버퍼링 독자를 변환하거나 웹 페이지를 검색 있는가 "STR을 적용"

    ;; 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))))) 
    

    java.lang.OutOfMemoryError: Java heap space (repl-1:3)" 내가 문제가이 생각하는 "얻을?

편집 : 나는

를 검색해야210

+0

Java보다는 clojure에서이 부분을 사용해야 할 이유가 있습니까? –

+0

내 전체 프로젝트가 클로저에 있습니다. 감사. – unj2

+1

나는이 프로젝트와 동일한 코드를 여러 프로젝트에서 사용하여 느린 작업을 가져 오지 않았습니다. 천천히 무엇을 의미합니까?페이지를 가져 오는 데 10 초가 걸립니까? –

답변

6

Yikes. line-seq은 한 줄에 하나의 String 개체를 만들려고합니다. 그러면 결국 연결 및 삭제되며, 이는 느리고 고통 스러울 것입니다. apply을 사용하면 이러한 모든 문자열을 거대한 목록에 넣고 str을 호출하면 고통 스러울 것입니다.

대신을 시도해보십시오

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

slurp* 자바에서 큰 문자열을 구축 할 수있는 좋은 방법입니다 StringBuilder를 사용합니다.

+0

URL에 많은 양의 데이터가있을 때이 코드가 질식합니다. – unj2

1

"너무 느리다"는 것은 무엇을 의미합니까? 여기서 병목 현상이 인터넷이 될 것이기 때문에 언어가 중요 할 것이라고 상상할 수는 없습니다.

+0

미안하지만 Java 힙 공간 (repl-1 : 3) – unj2

+0

@tomjen : niavely 연결 평균 길이 M의 N 개 문자열 목록은 O (N * N * M) 바이트를 복사하려고합니다. 반대로 다운로드에는 O (N * M) 바이트를 복사해야합니다. 이제는 비례 상수가 중요하지만 N만큼 큰 문자열 연결의 경우 다운로드 시간보다 오래 걸립니다. 이것은 언어 문제가 아닌 알고리즘 문제입니다. –

+0

추신 : 나는 "순진"이라고 말할 수 있습니다. 단지 입력 할 수 없습니다 :-) –

1

힙의 현재 크기는 얼마입니까? JVM 인수를 사용하여 -X arg로 더 많은 힙 공간을 지정할 수 있습니다.

자세한 내용은 JVM Tuning을 참조하십시오. 더 많은 시간이있는 경우 Java Profiler를 사용하여 응용 프로그램의 메모리가 부족한 이유를 확인하십시오. 힙 공간의 크기를 조정할 수는 있지만 일시적인 해결책입니다.

1

는 두 가지 가능성이 있습니다

  1. 당신이 가져 오는하는 내용의 크기는 사용 가능한 힙 공간의 상당 부분이며, 알고리즘은시 저장 작업에 2 ~ 3 배 크기를 필요 읽기/연결 프로세스. 이 경우 힙 공간을 늘리는 것이 합당한 해결 방법입니다.

  2. 알고리즘은 실제로 apply을 사용하여 연결을 수행하기 위해 O (N^2) 공간을 사용합니다. apply의 구현이 반복적이며 clojure 컴파일러/JIT 컴파일러가 중간 문자열에 대한 많은 참조를 갖는 재귀 코드를 생성한다는 것은 상상할 수 없습니다. 이 경우 힙 공간을 늘리는 것은 좋지 않은 해결 방법입니다.

어느 쪽이든, 내가 더 효율적인 대안 (apply str (line-seq buffer))를 대체하여 시작 했죠 (브라이언의 대답 @보고, @ tomjen의 대답에 내 의견) ... 그리고 아직도 경우에만 힙 사용에 대한 걱정을 이슈. (나는 그렇지 않다고 생각합니다.)

관련 문제