Quero exportar meus dados de vendas para um arquivo CSV em uma tarefa rake. A tabela de vendas tem aproximadamente 100 milhões de entradas. Como posso otimizar esse código? Ele parece ficar mais lento quanto mais tempo é executado.
sales = Sales.where(year: 2024)
BATCH_SIZE = 10_000
header_names = %w[user_id article_id amount currency date]
batch = []
File.open(filepath, 'w') do |file|
sales.find_each(batch_size: BATCH_SIZE)do |sale|
batch << sale.slice(*header_names).values.join(';')
if batch.size >= BATCH_SIZE
file.puts batch.join("\n")
batch.clear
end
end
file.puts batch.join("\n") unless batch.empty?
end
Isso me leva aproximadamente 23 minutos para exportar 17 milhões de entradas.
É melhor usar SQL bruto ( exemplo PostgreSQL ) para isso em vez de Ruby
É mais rápido
Ideia básica
Neste caso você não inicia objetos do Active Record
Os dados são gravados diretamente no arquivo em vez de criar grandes matrizes na memória
Para delimitador personalizado
Se você puder acessar o banco de dados diretamente, a melhor e mais rápida maneira é usar o
COPY
comando fornecido pelo banco de dados. Tomando o COPY do PostgreSQL como exemplo:Se você não consegue acessar o banco de dados diretamente ou prefere o código Ruby, você pode melhorar: