Portál AbcLinuxu, 9. května 2025 00:24
Řešení dotazu:
pv $1 | parallel --tmpdir tmp --pipe --files sort -u -T tmp -S512M --parallel=2 | parallel --tmpdir tmp -Xj1 sort -u -T tmp -S1024M --parallel=2 -m {} ';' rm {} > $2nutne definovat --tmpdir (u mna v aktualnom adresari) inac si zabijete /tmp (ak tam nemate dost miesta)
# cat /usr/share/dict/words | wc -l 38619 # cat /usr/share/dict/words | wc -c 352846Pokud by vyhledání klíče bylo rychlý (třeba hash), tak by to mohlo číst až rychlostí blízkou disku. Můj naivní kód v perlu, co parsuje asi 3.5GB lisp-like zdroják to zvládne na c2d asi za 30 minut, ale kromě hledání klíče to dělá i inserty do tisíců spojových seznamů apod (což je mnohem náročnější).
N=100000 split --lines=$N vstup for file in x* do cat $file | tr ' ' '\n' | sort -u > $file.usorted mv $file.usorted $file done cat x* | sort -u > vystupHodnotu N upraviť podľa potreby. To 'tr' je také neotesané riešenie, čo neberie do úvahy bodky, čiarky, atď. Možno by sa dalo nahradiť nejakým šikovnejším sed-om.
setrideny-seznam-unikatnich-slov="prázndný seznam" slovo=prectu-slovo() while (slovo!=null){ if (slovo "je v" setrideny-seznam-unikatnich-slov){ # náročnost operace O(log(N)) zaradit(slovo, setrideny-seznam-unikatnich-slov) # pro balancované seznam to je tuším také O(log(N)), navíc v předchozím vyhledávání už bylo nalezeno, kde v tom seznamu by tohle slovo mělo být a není takže by ty operace mohly být i rychlejší než log protože není třeba hledat. } }pak v setrideny-seznam-unikatnich-slov je pořád setříděno a pokud to není těch slov fakt moc tak se to možná i vejde do paměti.
uniq = set() with open('README.md') as f: for line in f: words = line.strip().split() for w in words: uniq.add(w) print(len(uniq))
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.