Процесс мониторинга дел [] по очень большому объему информации
В настоящее время я выполняю операции над очень большим текстом (~ 290 МБ простого текста в одном файле). После импорта в Mathematica 8, я в настоящее время начинаю работать, чтобы разбить его на нижние и т.д., Чтобы начать текстовый анализ.
Проблема в том, что эти процессы занимают много времени. Будет ли способ контролировать эти операции через Mathematica? Для операций с переменной я использовал ProgressIndicator и т.д. Но это другое. Мой поиск документации и StackOverflow не показал ничего подобного.
В следующем, я хотел бы отслеживать процесс команды Cases []:
input=Import["/users/USER/alltext.txt"];
wordList=Cases[StringSplit[ToLowerCase[input],Except[WordCharacter]],Except[""]];
Ответы
Ответ 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
из ничего.