IO read не читает весь файл

У меня есть очень большой текстовый файл, 958 МБ, и я создал следующий скрипт

f = IO.read ("Playback.xml").encode ("utf-8", replace: nil)    
separate_files_array = f.scan /strong text<Bla>.*?<\/Bla>/
counter=0
separate_files_array.each do |x|
    .
    .
    .
end

Следующий код перебирает только первые 31 вхождение этого регулярного выражения, и я понятия не имею, почему.

Нет, не может быть, что это все вхождения, я видел, что это не так, и скрипт работает несколько секунд - это не имеет смысла для файла такого размера.


person gilmishal    schedule 05.08.2015    source источник
comment
Невозможно узнать, что происходит без фактического файла Playback.xml — какой самый маленький из возможных файлов будет воспроизводить ошибку? Можете ли вы найти способ либо прикрепить его здесь, либо разместить его где-нибудь?   -  person matt    schedule 05.08.2015
comment
Это текстовый файл размером 900 МБ, содержащий множество XML-файлов, где Bla является корневым, а между каждым узлом Bla находится мусор. Скрипт предназначен для того, чтобы разбить его на более мелкие файлы.   -  person gilmishal    schedule 05.08.2015
comment
Нет возможности скопировать -   -  person gilmishal    schedule 05.08.2015
comment
Вы уверены, что виновником является IO.read, или возможно, что ошибка где-то еще? В чем причина .encode("utf-8", replace: nil)? replace:nil используется по умолчанию.   -  person cremno    schedule 05.08.2015


Ответы (1)


Проблема в том, что IO.read создает буфер по умолчанию и загружает в кеш только часть файла. В конце концов я использовал следующее, чтобы ответить на свой вопрос

Поиск по регулярному выражению в очень большом файле

причина в том, что File.read не создает буфер по умолчанию, что при использовании слишком большого файла может привести к сбою программы.

person gilmishal    schedule 06.08.2015