2017-06-07 6 views
-2

Ich erkannte, dass mein awk Skript mehr und mehr Speicher verwendete, als die Zeit verging, wenn ich nichts im Speicher speichern sollte, also entschied ich mich, einige Tests zu machen.awk match Befehl und Speichernutzung

Dies ist ein sehr einfaches Skript (meins ist größer, aber ich reproduzieren das Problem auf einem sehr einfachen). Mein awk Skript wird in einem bash Skript verwendet, die $file Variable ist die Datei, auf der die awk ausgeführt wird.

awk '  
{ 
    if(match($0,"word")) 
    {   
     line=substr($0, RSTART - 20, RLENGTH + 20) 
     print line 
    } 
} 
' "$file" 

Wenn ich dieses Skript auf einer großen Datei ausführen, in der jede Zeile word enthält, die Speicherauslastung des awk Skript hebt super schnell, noch schneller, wenn ich in eine Datei drucken. Ich muss es stoppen, bevor es meinen Computer einfriert. Hast du eine Idee, was diese große Speichernutzung verursacht? In meinem echten Skript sind die Dateien normalerweise kleiner und die match Funktion wird nicht wie bei dieser Funktion in jeder Zeile ausgelöst, aber ich würde lieber sicher gehen, dass nichts Falsches passieren wird.

EDIT: Dieses Problem scheint nicht bei der Verwendung von Mawk, nur mit GNU awk, ich habe keine Ahnung, warum.

+0

Nicht sicher, warum Sie "$ file" gesetzt haben, während Sie Input_file erwähnen? Versuchen Sie auch, eine neue Sitzung des Servers usw. zu machen und überprüfen Sie den Speicher und die CPU, indem Sie die Befehle top oder vmstat usw. ausführen, die Ihnen sagen, was im Hintergrund passiert. – RavinderSingh13

+0

Ich überprüft mit Top und die Speicherauslastung ist 4% höher alle 3 Sekunden Update (auf einer 2 GB VM). Wenn ich in eine Datei drucke, kann es alle 3 Sekunden um 12% steigen. Ich habe die von Ihnen erwähnte Eingabedatei nicht verstanden, das Skript läuft auf der Datei, die in der '$ file' -Variablen gespeichert ist. – Whin3

+0

Also in Befehl (was auch immer Sie verwendet haben), um herauszufinden, der hohe Speicher und CPU zeigt es dieses Skript ist dafür verantwortlich? in top oder htop könntest du es nach speicher oder cpu sortieren und sehen, wer schuld ist. Sie haben auch erwähnt, dass die Datei von einer Variablen kommt, stimmen Sie ihr zu, also welche Operationen machen Sie, bevor Sie diese awk aufrufen? Vielleicht müssen wir diese auch kennen, um Ihnen zu helfen. Bitte teilen Sie uns alle Details dazu mit. – RavinderSingh13

Antwort

0

Der Versuch, diese Alternative

awk '  
/word/ { 
     # you can match here, if result of operation is needed for later action 
     print "hello" 
    } 
' "$file" 

Spiel auf jeder Zeile etwas mehr Rechen induzieren wie der Index des längsten Vorkommen definieren (Test viele Möglichkeiten), ... so ja, es ist exponantial mit Dateigröße (und Zeilengröße innen)

wenn Match ein conditionnal Teil, der aus den umliegenden Code getrennt sein cannotn, zumindest Index() anstelle von Match() zu verwenden (oder besser if($0 ~ /word/) wenn nicht anderes Ergebnis als Anwesenheitskontrolle das Ziel ist)

+0

Es funktioniert mit 'if ($ 0 ~/Wort /)', aber ich habe verwendet, um den Index des Anfangs des Ausdrucks mit dem 'RSTART'-Wert zu erhalten. Ich habe gelesen, dass der Index nicht mit regexp funktioniert, und ich kann ihn später verwenden, also suche ich immer noch nach einer Lösung, die der "Übereinstimmung" ähnlich ist. – Whin3

+0

Optimierung des Codes/Algorithmus benötigt weitere Informationen über Objektive. Was möchten Sie mit den Übereinstimmungs- und Partnerinformationen tun? – NeronLeVelu

+0

Ich habe mein Beispiel bearbeitet, um eine bessere Vorstellung davon zu bekommen, was ich mache. Ich benutze die "match" -Funktion, um den Anfang des passenden Wortes mit dem RSTART-Wert zu erhalten, und extrahiere dann einen Teil der Zeile mit RSTART und RLENGTH. – Whin3

0

Das Problem scheint bei der Verwendung von Mawk nicht zu erscheinen, nur mit GNU awk.

löse ich das Problem, indem LC_ALL=C vor dem awk Skript, wie folgt aus:

LC_ALL=C awk '  
{ 
    if(match($0,"word")) 
    {   
     line=substr($0, RSTART - 20, RLENGTH + 20) 
     print line 
    } 
} 
' "$file" 

EDIT: Das Problem tritt nicht auf GNU 4.1.4 awk. Das scheint nur bei älteren Versionen zu passieren (meins war 3.1.3)

+0

Einstellung LC_ALL sollte die Leistung verbessern, nicht die Speicherbelegung. Wenn das stimmt, müssen Sie den GNU-Leuten diesen großen Fehler melden, damit sie ihn beheben können. E-Mail dann an [email protected] und stellen Sie sicher, dass Sie die OS, Shell und Gawk-Version enthalten, auf der Sie laufen (gawk --version | head -2). Stellen Sie sicher, dass Sie die neueste Gawk-Version (4.1.4, denke ich?) Zuerst und nur Follow-up, wenn das Problem dort auftritt, kein Problem, wenn Sie auf einer alten Version sind. –

+1

Meine GNU Awk-Version war eine alte (3.1 etwas). Die Aktualisierung auf die letzte Version 4.1.4 hat das Problem gelöst. – Whin3

Verwandte Themen