Чтение файла в EventMachine асинхронно - PullRequest
6 голосов
/ 14 октября 2011

Я уже некоторое время играю с Ruby EventMachines и думаю, что понимаю его основы.

Однако я не уверен, как правильно читать большие файлы (120 МБ).Моя цель - построчно читать файл и записывать каждую строку в базу данных Cassandra (то же самое должно быть с MySQL, PostgreSQL, MongoDB и т. Д., Поскольку клиент Cassandra явно поддерживает EM).Простой фрагмент кода блокирует реактор, верно?

require 'rubygems'
require 'cassandra'
require 'thrift_client/event_machine'

EM.run do
  Fiber.new do
    rm = Cassandra.new('RankMetrics', "127.0.0.1:9160", :transport => Thrift::EventMachineTransport, :transport_wrapper => nil)
    rm.clear_keyspace!
    begin
      file = File.new("us_100000.txt", "r")
    while (line = file.gets)
      rm.insert(:Domains, "#{line.downcase}", {'domain' => "#{line}"})
    end
      file.close
    rescue => err
      puts "Exception: #{err}"
      err
    end
    EM.stop
  end.resume
end

Но как правильно получить асинхронное чтение файла?

Ответы [ 2 ]

5 голосов
/ 14 октября 2011

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

EM.run do
  io = File.open('path/to/file')
  read_chunk = proc do
    lines_sent = 10
    10.times do
      if line = io.gets
        send_to_db(line) do
          # when the DB call is done
          lines_sent -= 1
          EM.next_tick(read_chunk) if lines_sent == 0
        end
      else
        EM.stop
      end
    end
  end
  EM.next_tick(read_chunk)
end

См. Как лучше всего читать файлы в приложении на основе EventMachine?

1 голос
/ 15 октября 2011

Если вы еще этого не сделали, вы можете взглянуть на EM :: FileStreamer .С одной стороны, FileStreamer использует «быстрый читатель файлов» на C ++.Не могли бы вы передать файл через локальный сокет / канал и обработать отправку в базу данных в отдельном процессе, который прослушивает другой конец?

Также есть пример не-Fiber обработки изящной обработки соединений db в ThreadedResource , в случае, если это полезно ... в частности, упоминается Cassandra.Хотя, похоже, ваша библиотека Cassandra основана на волокне.

...