Saya memuat file yang sangat besar ke database postgresql. Untuk melakukan ini saya pertama kali menggunakan split
dalam file untuk mendapatkan file yang lebih kecil (masing-masing 30Gb) dan kemudian saya memuat setiap file yang lebih kecil ke database menggunakan GNU Parallel
dan psql copy
.
Masalahnya adalah bahwa dibutuhkan sekitar 7 jam untuk membagi file, dan kemudian mulai memuat file per inti. Yang saya butuhkan adalah cara untuk memberi tahu split
untuk mencetak nama file ke std output setiap kali selesai menulis file sehingga saya dapat mengirimnya ke pipa Parallel
dan mulai memuat file pada saat split
selesai menulisnya. Sesuatu seperti ini:
split -l 50000000 2011.psv carga/2011_ | parallel ./carga_postgres.sh {}
Saya telah membaca split
halaman manual dan saya tidak dapat menemukan apa pun. Apakah ada cara untuk melakukan ini dengan split
atau alat lain?
sumber
Mengapa tidak menggunakan --pipe DAN --pipepart dengan GNU Parallel? Ini menghilangkan kucing ekstra dan mulai membaca langsung dari file pada disk:
sumber
Saya menemukan jawaban yang diposting di sini adalah cara yang kompleks, jadi saya bertanya pada Stack Overflow dan saya mendapat jawaban ini :
Jika Anda menggunakan
GNU split
, Anda dapat melakukan ini dengan--filter
opsiAnda dapat membuat skrip shell, yang membuat file dan mulai carga_postgres.sh di akhir di latar belakang
dan gunakan skrip itu sebagai filter
sumber
Alternatif untuk membuat
split
mencetak nama file adalah dengan mendeteksi kapan file siap. Di Linux, Anda dapat menggunakan fasilitas inotify , dan khususnyainotifywait
utilitas.Anda harus membunuh
inotifywait
secara manual. Membunuh secara otomatis agak sulit karena ada kondisi lomba yang potensial: jika Anda membunuhnya segera setelahsplit
selesai, ia mungkin telah menerima peristiwa yang belum dilaporkan. Untuk memastikan bahwa semua acara dilaporkan, hitung file yang cocok.sumber