Je charge un fichier assez gigantesque dans une base de données postgresql. Pour ce faire, j'utilise d'abord split
le fichier pour obtenir des fichiers plus petits (30 Go chacun), puis je charge chaque fichier plus petit dans la base de données à l'aide de GNU Parallel
et psql copy
.
Le problème est qu'il faut environ 7 heures pour diviser le fichier, puis il commence à charger un fichier par cœur. Ce dont j'ai besoin est un moyen de dire split
d'imprimer le nom du fichier sur la sortie std chaque fois qu'il termine l'écriture d'un fichier afin que je puisse le diriger Parallel
et qu'il commence à charger les fichiers au moment où il a split
fini de l'écrire. Quelque chose comme ça:
split -l 50000000 2011.psv carga/2011_ | parallel ./carga_postgres.sh {}
J'ai lu les split
pages de manuel et je ne trouve rien. Existe-t-il un moyen de le faire avec split
ou tout autre outil?
la source
Pourquoi ne pas utiliser --pipe ET --pipepart avec GNU Parallel? Cela élimine le chat supplémentaire et démarre les lectures directes à partir du fichier sur le disque:
la source
J'ai trouvé que les réponses publiées ici étaient trop complexes, alors j'ai demandé sur Stack Overflow et j'ai obtenu cette réponse:
Si vous utilisez
GNU split
, vous pouvez le faire avec l'--filter
optionVous pouvez créer un script shell, qui crée un fichier et lancez carga_postgres.sh à la fin en arrière-plan
et utiliser ce script comme filtre
la source
Une alternative à l'
split
impression des noms de fichiers est de détecter quand les fichiers sont prêts. Sous Linux, vous pouvez utiliser la fonction inotify , et en particulier l'inotifywait
utilitaire.Vous devrez tuer
inotifywait
manuellement. Le tuer automatiquement est un peu difficile car il existe une condition de course potentielle: si vous le tuez dès lasplit
fin, il peut avoir reçu des événements qu'il n'a pas encore signalés. Pour vous assurer que tous les événements sont signalés, comptez les fichiers correspondants.la source