Yajl для потоковой передачи огромного файла json с данными массива и действия с каждой записью

У меня есть огромный файл json с данными массива, содержащими записи json из базы данных. Скажем ниже

[
{"id":2,"name":"def","price":3.714714089426208},
{"id":3,"name":"ghi","price":27.0179624376119},
{"id":1,"name":"abc","price":52.51248221170203}
]

Я хотел бы передать файл и обработать одну запись за раз. Посоветуйте, как это делается.

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

class JsonStreamer

  attr_accessor :parser

  def initialize()
    post_init
  end

  def post_init
    @parser = Yajl::Parser.new(:symbolize_keys => true)
    @parser.on_parse_complete = lambda {|obj|
      puts obj
      puts "-----------------------End of object --------------------------------"
    }
  end

  def receive_data(data)
    # continue passing chunks
    @parser << data
  end

  def parse(f)
    File.open(f, 'r') do |f|
      f.each(100) {|chunk| receive_data (chunk)}
    end

  end

end

js = JsonStreamer.new()
js.parse('sample.json')

person Naga    schedule 20.04.2019    source источник


Ответы (1)


Я предлагаю ознакомиться с примером гема json-streamer. .

person Nick Edgar    schedule 20.04.2019