13 Stimmen

Überwachungsprozess von Fällen[] auf einer sehr großen Informationsmenge

Ich führe derzeit Operationen an einem sehr großen Textkörper durch (~290 MB reinen Text in einer Datei). Nach dem Import in Mathematica 8 beginne ich gerade damit, ihn in Kleinbuchstabenwörter usw. zu zerlegen, damit ich mit der textuellen Analyse beginnen kann.

Das Problem ist, dass diese Prozesse lange dauern. Gibt es eine Möglichkeit, diese Operationen über Mathematica zu überwachen? Für Operationen mit einer Variablen habe ich ProgressIndicator usw. verwendet. Aber das ist anders. Meine Suche in der Dokumentation und bei StackOverflow hat nichts Ähnliches ergeben.

Im Folgenden möchte ich den Prozess des Cases[]-Befehls überwachen:

input=Import["/users/USER/alltext.txt"];
wordList=Cases[StringSplit[ToLowerCase[input],Except[WordCharacter]],Except[""]];

11voto

Joshua Martell Punkte 7083

Etwas wie StringCases[ToLowerCase[input], WordCharacter..] scheint ein wenig schneller zu sein. Und ich würde wahrscheinlich DeleteCases[expr, ""] anstelle von Cases[expr, Except[""]] verwenden.

10voto

WReach Punkte 17728

Es ist möglich, den Fortschritt der Operationen StringSplit und Cases zu sehen, indem "counter" Operationen in die gematchten Muster eingefügt werden. Der folgende Code zeigt vorübergehend zwei Fortschrittsbalken: der erste zeigt die Anzahl der verarbeiteten Zeichen von StringSplit und der zweite zeigt die Anzahl der verarbeiteten Wörter von Cases:

input = ExampleData[{"Text", "PrideAndPrejudice"}];

wordList =
  Module[{charCount = 0, wordCount = 0, allWords}
  , PrintTemporary[
      Row[
        { "Characters: "
        , ProgressIndicator[Dynamic[charCount], {0, StringLength@input}]
        }]]

  ; allWords = StringSplit[
        ToLowerCase[input]
      , (_ /; (++charCount; False)) | Except[WordCharacter]
      ]

  ; PrintTemporary[
      Row[
        { "Words:      "
        , ProgressIndicator[Dynamic[wordCount], {0, Length@allWords}]
        }]]

  ; Cases[allWords, (_ /; (++wordCount; False)) | Except[""]]

  ]

Der Schlüssel zu dieser Technik liegt darin, dass die verwendeten Muster in beiden Fällen gegen das Wildcard _ passen. Allerdings wird diese Wildcard von einer Bedingung abgesichert, die immer fehlschlägt - aber erst, nachdem sie einen Zähler inkrementiert hat. Die "echte" Match-Bedingung wird dann als Alternative verarbeitet.

5voto

Heike Punkte 23774

Es hängt ein wenig davon ab, wie Ihr Text aussieht, aber Sie könnten versuchen, den Text in Abschnitte aufzuteilen und über diese zu iterieren. Sie könnten dann den Iterator mit Monitor überwachen, um den Fortschritt zu sehen. Wenn Ihr Text beispielsweise aus Textzeilen besteht, die durch einen Zeilenumbruch beendet werden, könnten Sie etwas Ähnliches wie dies tun

Module[{list, t = 0},
 list = ReadList["/benutzer/BENUTZER/alltext.txt", "String"];
 Monitor[wordlist = 
   Flatten@Table[
     StringCases[ToLowerCase[list[[t]]], WordCharacter ..], 
      {t, Length[list]}], 
  Labeled[ProgressIndicator[t/Length[list]], N@t/Length[list], Right]];
 Print["Bereit"]] 

Auf einer Datei von etwa 3 MB dauerte dies nur unwesentlich länger als der Vorschlag von Joshua.

4voto

rcollyer Punkte 10285

Ich weiß nicht, wie Cases funktioniert, aber die Verarbeitung von List kann zeitaufwändig sein, insbesondere wenn der List während des Aufbaus erstellt wird. Da eine unbekannte Anzahl von Begriffen im verarbeiteten Ausdruck vorhanden ist, ist es wahrscheinlich, dass dies bei Cases der Fall ist. Deshalb würde ich etwas leicht anderes ausprobieren: Ersetzen von "" durch Sequence[]. Zum Beispiel wird dieser List

{"5", "6", "7", Sequence[]}

zu

{"5", "6", "7"}.

Also versuche

bigList /. "" -> Sequence[]

es sollte schneller funktionieren, da es keinen großen List aus dem Nichts aufbaut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X