Portál AbcLinuxu, 10. května 2024 20:05
visco.dat
, ktery v podstate obsahuje tri sloupce ciselnych dat. Je v nem zapsano celkem 285 skenu po 2048 radcich, oddelenych vzdycky 5 radky balastu. Velikost souboru je asi 20MiB.
bash-2.05b$ wc visco.dat 585105 1754175 19876543 visco.dat
Potreboval bych jako vystup soubor visco.txt
, zbaveny toho balastu, aby v nem zbyly jenom ty cisla. Zaroven (pro jistotu, kdyby ten vysledek byl tak velky, ze by ho nasledne Octave neschroupla -- neznam limity Octave, takze jistota je jistota), bych chtel jako vystup rozdeleny do 285 souboru podle tech skenu. Napsal jsem si na to nasledujici skript:
#!/bin/bash# Sortovani viskozitnich dat z DMA# vzdycky 5 radku srotu a 2048 radku dat; # v souboru visco.dat, celkem 285xrm cdeclare -i a b c;a=0;until [ $a = 285 ]; do echo $a b=0; until [ $b = 2048 ]; do c=2053*a+b+6; sed -ne "$c p" visco.dat >> visco.$a; sed -ne "$c p" visco.dat >> visco.txt; b=b+1; done a=a+1;done
Skript jsem spustil vcera odpoledne a dneska rano jsem ocekaval vysledek. Prave ted je to nekde u 55. skenu, takze je hotova asi jedna petina. To se mi zda pomerne pomale (Athlon 750MHz, 320MiB RAM, Slackware 9.1, kernel 2.6.9, reiserfs). Podel top
basti skript okolo 0.3 % CPU i RAM, sed
mezi 2-20 % CPU a cca 5 % RAM.
Predpokladam, ze podobnou ulohu budu resit casteji, tak bych se chtel zeptat, jestli nekoho nenapada, jak to trochu urychlit. DMA masina vychrli tenhle soubor dat asi po hodine mereni a to je jeden vzorek.
Mozna by to chtelo postavit se k tomu problemu uplne jinak, ja jsem vychazel z toho, co uz znam (a toho neni v oblasti programovani a psani skriptu mnoho).
Dik za rady, JS
#!/bin/sed -nf 1,2048 wvisco.1 2049,2052 wvisco.txt 2053,4100 wvisco.2 4101,4105 wvisco.txt ...které použiješ
./v.sed <visco.datSamozřejmě, že v.sed je sám také generovatelný, což uděláš jednou nebo když se změní počty.
#!/usr/bin/python import sys # Zdravím Leoše a děkuji mu za P tagy base = 'visco' nd = 2048 nt = 5 # Zdravím Leoše a děkuji mu za P tagy i = 0 for line sys.stdin: if i % (nd + nt) == 0: fi = file(base + ('.%03d' % (i/(nd + nt) + 1)), 'w') if i % (nd + nt) < nd: fi.write(line) i += 1Spojit výsledky catem snad zvládneš.
for((i=0;i<285;i++)); do #nejdriv prectu balast for((j=0;j<5;j++)); do read radek; done #pak uzitecne radky for((j=0;j<2048;j++)); do read radek; echo $radek >>visco.$i echo $radek >>visco.txt done doneRekl bych, ze tohle to opravdu dokaze "trochu" urychlit
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.