2010-11-28 6 views
2

Я запустил эту программу ниже с символом-символом нескольких сотен символов, и в какой-то момент он говорит, что недостаточно памяти, тогда как я повторно использую одну и ту же переменную, почему?Rebol: проблема с недостаточной памятью

base-url: http://www.google.com/finance/historical 
download-directory: "askpoweruser/stock-download/google/files/" 
column-header: "Time;Open;High;Low;Close;Volume" 
#debug: true 

symbol_list: parse/all {GOOG AAPL MSFT INDEXDJX:.DJI} " " 
ans: ask {symbols by default "GOOG AAPL MSFT INDEXDJX:.DJI": } 
if (ans <> "") [symbol_list: parse/all ans " "] 
;do code-block/2 

foreach symbol symbol_list [ 
    url0: rejoin [base-url "?q=" symbol] 
    dir: make-dir/deep to-rebol-file download-directory 

    either none? filename: find symbol ":" [ 
    filename: symbol 
    url: rejoin [url0 "&output=csv"] 

    either not error? try [content: read url][ 
     out-string: copy rejoin [column-header newline] 
     quotes: parse/all content ",^/" 
     reversed-quotes: reverse quotes 

     foreach [v c l h o d] reversed-quotes [ 
      either not (error? try [d: to-date d]) [ 
       d: rejoin [d/year "-" d/month "-" d/day] 
       append out-string rejoin [d ";" o ";" h ";" l ";" c ";" v newline] 
      ][ 
       ;print [d "is not a date"] 
       ;input 
      ] 

     ] 
     filename: rejoin [filename "_" "1440"] 
     write to-rebol-file rejoin [dir filename ".csv"] out-string 
     print filename 
    ][ 
     print ["Error for symbol" symbol] 
    ] 
    ][ 
    filename: replace/all replace/all filename ":" "" "." "" 
    out: copy [] 
    for i 0 1 1 [ 
     p: i 
     url: rejoin [url0 "&start=" (p * 200) "&num=" ((p + 1) * 200)] 
     content: read url 
     rule: [to "<table" thru "<table" to ">" thru ">" 
      to "<table" thru "<table" to ">" thru ">" 
      to "<table" thru "<table" to ">" thru ">" 
      copy quotes to </table> to end 
     ] 
     parse content rule 

     parse quotes [ 
      some [to "<td" thru "<td" to ">" thru ">" [copy x to "<" | copy x to end] (append out replace/all x "^/" "")] 
      to end 
     ] 
     if #debug [ 
      write/lines to-rebol-file rejoin [dir filename "_" p ".html"] quotes 
     ] 

    ] 
    if #debug [ 
     write to-rebol-file rejoin [dir filename "_temp" ".txt"] mold out 
    ] 
    out-string: copy rejoin [column-header newline] 
    out: reverse out  

    foreach [v c l h o d] out [ 
     d: parse/all d " ," 
     d: to-date rejoin [d/4 "-" d/1 "-" d/2] 
     d: rejoin [d/year "-" d/month "-" d/day] 
     append out-string replace/all rejoin [d ";" o ";" h ";" l ";" c ";" v newline] "," "" 
    ] 
    filename: rejoin [filename "_" "1440"] 
    write to-rebol-file rejoin [dir filename ".csv"] out-string 
    print filename 
    ] 

] 

Чтобы получить список символов, которые вы можете использовать это (Rebol разбился выше перед буквой H):

alphabet: [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] 
symbol-list: copy [] 
rule: [ 
    to <table class="quotes"> 
    some [ to {<A href="/stockquote} to ">" thru ">" copy symbol to "<" (append symbol-list symbol)] 
    to </table> 
] 
foreach letter alphabet [ 
    content: read to-url rejoin ["http://www.eoddata.com/stocklist/NYSE/" letter ".htm"] 
parse content rule 
probe symbol-list 
write/append %askpoweruser/stock-download/symbol-list-nyse.txt mold symbol-list 
] 
+0

EDIT:.. удален тег HTML – Tom 2010-11-28 17:24:13

ответ

4

вы можете поставить «функцию STAT в одном из ваших петель, чтобы попытаться выяснить, если и где происходит утечка памяти.

из ошибок памяти обычно происходит в одной из этих ситуаций или что-то подобное:

  • прилагаемых к серии, который не очищен или скопированного в начале функции с петлей

  • полное дерево данных не сбрасывается ни на один (на каждом листе и ветке) в ситуации, когда некоторые (отдельные?) подэлементы ссылаются вне дерева, и весь блок данных заканчивается попаданием в баран, неспособным освободиться

  • при печати очень большой строки или вложенного дерева больших объектов (например, лицо VID содержит ссылку на полный файл стилей, поэтому печать окна большого приложения обычно терпит неудачу).

  • Некоторые переполнения стека (бесконечные рекурсии или циклы) иногда ошибочно сообщаются как ошибки памяти.

  • распределение одного предмета растет экспоненциально ... как изображение! при умножении каждого прохода на 10 по обеим осям ... эффективно увеличивая на два порядка величины, который обычно терпит неудачу при числах в диапазоне n * 10k.

  • самый большой элемент в GC иногда никогда не снимается в соответствии с субоптимальным R2 GC (большие изображения могут имеют этот симптом).

  • рекурсивные правила разбора создаются данные и одно правило бесконечно (это происходит очень быстро по правилам, как [правило | ни].. Ни эффективно эквивалентном навсегда в этом случае

3

Он работает без проблемы, но некоторые примечания:.

instead: 
read to-url rejoin ["http://www.eoddata.com/stocklist/NYSE/" letter] 
you can use just: 
read join http://www.eoddata.com/stocklist/NYSE/ letter 

instead: 
either not cond [1][2] 
you should use: 
either cond [2][1] 

instead: 
download-directory: "askpoweruser/stock-download/google/files/" 
dir: make-dir/deep to-rebol-file download-directory 
write to-rebol-file rejoin [dir filename "_temp" ".txt"] mold out 

use: 
download-directory: %askpoweruser/stock-download/google/files/ 
dir: make-dir/deep download-directory 
write rejoin [dir filename %_temp.txt] mold out 

what the hell means?!: 
for i 0 1 1 [ 
     p: i 
     url: rejoin [url0 "&start=" (p * 200) "&num=" ((p + 1) * 200)] 
.. 

 Смежные вопросы

  • Нет связанных вопросов^_^