> 2GB metin dosyasında 6000'den fazla dizeyi aramak ve değiştirmek istiyorum.
sed -i "s/search/replace/g" 2gbfile.log
Sonsuza dek alıyor. Özellikle 6000'den fazla kez yapmanız gerekiyorsa.
Bu yüzden 2 GB dosyasını parçalara ayıran bir komut dosyası buldum, böylece çabayı paralelleştirebiliyorum. Aynı anda 48 işlem yürütüyorum (64 çekirdek kullanılabilir), ancak yine de oldukça uzun sürüyor.
#!/usr/bin/env bash
echo "sorting..."
sort bigbigbigfile | awk -F, '{print $2,$1,$3}' > bigbigbigfile.work
CPUS=$(( $(lscpu |grep "On-line CPU(s) list"|grep -Eo '0-[0-9]+'|cut -f2 -d-) + 1))
CPUSUSABLE=$(echo "$CPUS*0.75" | bc | cut -f1 -d.)
NUMLINES=$(cat all-temperatures.sort | wc -l)
SPLIT=$(echo "$NUMLINES / $CPUSUSABLE" | bc | cut -f1 -d.)
echo "cutting..."
split -l $SPLIT bigbigbigfile.work chunkstoworkwith
mapfile -t REPLACEME < replace.list
echo "seding..."
for chunk in $(ls chunkstoworkwith*); do
(
for i in "${!REPLACEME[@]}"; do
counter=$(( counter + 1 ))
sed -i "s/ ${REPLACEME[$i]} / $counter /g" $chunk
done
) &
done
Bu çalışıyor. Ancak, bellekte arama ve değiştirme işleminde daha hızlı olabileceğini düşünüyorum, yerine yerinde değişiklik yapmaktan ve 48 dosyada 6000'den fazla değişiklik yapmak yerine. Bu neredeyse 300k adede kadar çağrıyı toplar ve bu da birçok dosya açma / kapama / yazma / neyse sonuçlanır.
Bunun nasıl hızlandırılacağı ve bellekteki değişimlerin nasıl yapılacağı ve her şey değiştikten sonra verilerin silinmesi konusunda bir fikrin var mı?