Ich habe einen PC mit Intel (R) Pentium (R) -CPU G640 bei 2,80 GHz und 8 GB RAM. Ich führe darauf Scientific Linux 6.5 mit EXT3-Dateisystem aus.
Wie kann ich in diesem Setup sort -u
eine 200-Gigabyte-Datei am schnellsten bearbeiten?
Soll ich die Datei in kleinere Dateien (kleiner als 8 GB) sort -u
aufteilen, sie zusammenfügen und dann wieder in eine andere Größe aufteilen sort -u
usw.? Oder gibt es Sortierskripte, Programme, die mit meiner begrenzten RAM-Größe so große Dateien verarbeiten können?
/tmp
.parallel
dafür brauchen, denke ich, und nicht die moreutilsparallel
, die auf einigen Systemen standardmäßig installiert sind.sort(1)
könnte keinen Platz mehr haben/tmp
; In diesemTMPDIR
-T=<tmpdir>
Antworten:
GNU
sort
(dies ist die Standardeinstellung auf den meisten Linux-Systemen) hat eine--parallel
Option. Von http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html :Da Ihre CPU 2 Kerne hat, können Sie Folgendes tun:
Es ist besser, die tatsächliche Anzahl der Kerne anzugeben, da aufgrund des Prozessors mit Hyper-Threading möglicherweise mehr Kerne vorhanden sind .
Sie können auch experimentieren
nice
, um die Priorität der Prozessorplanung undionice
die E / A-Planung zu beeinflussen. Sie können die Priorität gegenüber anderen Prozessen wie diesem erhöhen. Ich glaube nicht, dass dies zu erheblichen Einsparungen führt, da diese normalerweise besser sind, um sicherzustellen, dass ein Hintergrundprozess nicht zu viele Ressourcen verbraucht. Trotzdem können Sie sie mit etwas wie kombinieren:Wie Gilles bemerkte, ist die Verwendung eines einzelnen GNU-Sortierbefehls schneller als jede andere Methode zum Auflösen der Sortierung, da der Algorithmus bereits für die Verarbeitung großer Dateien optimiert ist. Alles andere wird wahrscheinlich nur die Dinge verlangsamen.
quelle
sort
direkter Anruf besser ist als alles andere, was Sie tun können. GNU sort ist so konzipiert, dass es mit Dateien, die viel größer als RAM sind, gut zurechtkommt.Die Verwendung des
sort
Befehls ist wahrscheinlich die schnellste Option.Aber Sie werden wahrscheinlich das Gebietsschema auf C festlegen wollen.
sort -u
meldet keine eindeutigen Zeilen, sondern eine von jedem Satz von Zeilen, die gleich sortiert sind. Im C-Gebietsschema müssen 2 verschiedene Zeilen nicht unbedingt gleich sortiert sein, aber das ist in den meisten UTF-8-basierten Gebietsschemata auf GNU-Systemen nicht der Fall.Durch die Verwendung des Gebietsschemas C wird außerdem vermieden, dass UTF-8 analysiert und komplexe Sortierreihenfolgen verarbeitet werden müssen, wodurch die Leistung erheblich verbessert wird.
So:
Sie können die Leistung auch verbessern, indem Sie ein schnelleres Laufwerk (oder ein anderes Laufwerk als das, auf dem sich die Eingabe- und / oder Ausgabedateien befinden) für die temporären Dateien (mit
-T
oder$TMPDIR
Umgebungsvariable) verwenden oder-S
die von einigensort
Implementierungen unterstützte Option ausprobieren. .Bei bestimmten Eingaben oder bei langsamer Speicherung kann die Verwendung der
--compress-program
GNU-Optionsort
(z. B. mitlzop
) zusätzlich zur Speichernutzung die Leistung verbessern.quelle
Hier ist ein fertiges Bash-Skript zum Sortieren von TB-Skalendaten auf einem normalen Computer mit ein paar GB RAM: http://sgolconda.blogspot.com/2015/11/sort-very-large-dataset.html Überprüft die Anzahl von Kerne deine Maschine wie und benutze alle Kerne. Kann numerische oder String-Dateien sortieren. Kann verwendet werden, um eindeutige Datensätze in TB-Skalendaten zu finden.
quelle