читать CSV-файл из данного индекса для индексации в рельсах - PullRequest
0 голосов
/ 01 февраля 2019

У меня очень большой файл в миллионах строк, и я хочу вставить их в базу данных, но не могу одновременно создать или импортировать, потому что он блокирует дБ и требует много оперативной памяти.Итак, я хочу создать задания, которые читают индекс в индекс из файла csv (например, первое задание читает от 0 до 1000 строк, другое задание читает от 1000 до 2000, как разумно), но я думаю, что CSV.foreach не имеет такой функции, и яне может отправить 1000 строк данных в качестве аргумента задания и не может открыть этот файл в каждом задании.Поэтому, пожалуйста, наведите меня

Получив путь к файлу, я прочитал общее количество строк (предположим, 1 миллион) и разделил на 1000 заданий, где в каждом задании я даю путь к файлу и индекс, откуда задание должно начинаться с чтения.На каждой работе

def perform(file_name, index){

    CSV.foreach(file_name, :headers => true) do |row| # want to start with index*1000 
        hash = row.to_hash
        if if i>= index*1000 + 1000
             Table.import arr_hash
             arr_hash = []
             break if i>= index*1000 + 1000
        end
        arr_hash<<Table.new(hash)
    end
    if arr_hash
      Table.import arr_hash
    end
}

1 Ответ

0 голосов
/ 02 февраля 2019

Вы можете легко сделать это, используя Smarter CSV

SmarterCSV.process('csv_file_path', {:col_sep => ",", :force_utf8 => true, :chunk_size => 1000}) do |chunk|
  # process your chunk here
  # assign each chunk to a Job to process 1000 rows per job
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...