Подтвердить что ты не робот

Процесс мониторинга дел [] по очень большому объему информации

В настоящее время я выполняю операции над очень большим текстом (~ 290 МБ простого текста в одном файле). После импорта в Mathematica 8, я в настоящее время начинаю работать, чтобы разбить его на нижние и т.д., Чтобы начать текстовый анализ.

Проблема в том, что эти процессы занимают много времени. Будет ли способ контролировать эти операции через Mathematica? Для операций с переменной я использовал ProgressIndicator и т.д. Но это другое. Мой поиск документации и StackOverflow не показал ничего подобного.

В следующем, я хотел бы отслеживать процесс команды Cases []:

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

Ответ 1

Можно просмотреть ход операций StringSplit и Cases, введя операции "счетчик" в сопоставленные шаблоны. Следующий код временно отображает два индикатора выполнения: первое показывает количество символов, обработанных StringSplit, а второе показывает количество слов, обработанных Cases:

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

wordList =
  Module[{charCount = 0, wordCount = 0, allWords}
  , PrintTemporary[
      Row[
        { "Characters: "
        , ProgressIndicator[Dynamic[charCount], {0, [email protected]}]
        }]]

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

  ; PrintTemporary[
      Row[
        { "Words:      "
        , ProgressIndicator[Dynamic[wordCount], {0, [email protected]}]
        }]]

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

  ]

Ключом к методу является то, что шаблоны, используемые в обоих случаях, соответствуют шаблону _. Однако этот подстановочный знак защищен условием, которое всегда терпит неудачу, но только до тех пор, пока он не увеличит счетчик в качестве побочного эффекта. Условие "реального" соответствия затем обрабатывается как альтернатива.

Ответ 2

Что-то вроде StringCases[ToLowerCase[input], WordCharacter..] кажется немного быстрее. И я, вероятно, использовал бы DeleteCases[expr, ""] вместо Cases[expr, Except[""]].

Ответ 3

Это немного зависит от того, как выглядит ваш текст, но вы можете попробовать разделить текст на куски и перебрать их. Затем вы можете контролировать итератор, используя Monitor, чтобы увидеть прогресс. Например, если ваш текст состоит из строк текста, завершенных новой строкой, вы можете сделать что-то вроде этого

Module[{list, t = 0},
 list = ReadList["/users/USER/alltext.txt", "String"];
 Monitor[wordlist = 
   [email protected][
     StringCases[ToLowerCase[list[[t]]], WordCharacter ..], 
      {t, Length[list]}], 
  Labeled[ProgressIndicator[t/Length[list]], [email protected]/Length[list], Right]];
 Print["Ready"]] 

В файле размером около 3 МБ это заняло лишь немного больше времени, чем предложение Джошуа.

Ответ 4

Я не знаю, как работает Cases, но обработка List может занять много времени, особенно если она строит List по мере ее появления. Поскольку в обработанном выражении присутствует неизвестное количество терминов, вероятно, это то, что происходит с Cases. Итак, я бы попробовал что-то другое: заменив "<" на Sequence[]. Например, это List

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

становится

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

Итак, попробуйте

bigList /. "" -> Sequence[]

он должен работать быстрее, поскольку он не создает большой List из ничего.