Ребол: проблема с нехваткой памяти - PullRequest
2 голосов
/ 28 ноября 2010

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

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
  ]

]

Чтобы получить список символов, вы можете использовать это (ребол разбился выше перед буквой 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
]

Ответы [ 2 ]

4 голосов
/ 09 декабря 2010

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

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

  • добавление к серии, которая не очищается или не копируется в начале функции с помощью цикла

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

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

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

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

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

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

3 голосов
/ 09 декабря 2010

Работает без проблем. но некоторые заметки:

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)]
..
...