Yajl для потоковой передачи огромного файла JSON с массивом данных и обработки каждой записи - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть огромный 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')

1 Ответ

0 голосов
/ 20 апреля 2019

Предлагаю проверить json-streamer пример драгоценного камня .

...