Как запустить поиск по словарю для большого текстового файла? - PullRequest
1 голос
/ 31 мая 2009

Мы находимся на финальной стадии поставки нашей консольной игры. На Wii у нас, конечно, больше всего проблем с памятью, поэтому мы заняты поиском неаккуратного кодирования, упаковки битов и т. Д.

Я сделал дамп памяти и использовал strings.exe (из sysinternals), чтобы проанализировать его, но в нем было много грязи, подобной этой:

''''$$$$    %%%%
''''$$$$%%%%####&&&&
''''$$$$((((!!!!$$$$''''((((####%%%%$$$$####((((
''))++.-$$%&''))
'')*>BZf8<S]^kgu[faniwkzgukzkzkz
'',,..EDCCEEONNL

Меня больше интересуют такие строки:

wood_wide_end.bmp
restroom_stonewall.bmp

... что означает, что мы все еще встраиваем некоторые типы строк, которые необходимо преобразовать в идентификаторы.

Итак, мой вопрос: каковы некоторые хорошие способы найти материал, который, вероятно, наши отладочные данные, которые мы можем удалить?

Я могу сделать некоторые команды, чтобы взломать символы или просто искать определенные виды строк. Но то, что я действительно хотел бы сделать, - это взять стандартный файл словаря и найти в нем мой файл строк. Кажется медленным, если бы я собирал большой rx с помощью aardvaark | alimony | archetype и т. Д. Или это будет работать достаточно хорошо, если я сделаю для него скомпилированную сборку .x 101?

Ищите другие идеи о том, как найти то, что мы тоже хотим устранить. Быстрые и грязные решения, не нужно элегантно. Спасибо!

Ответы [ 2 ]

1 голос
/ 31 мая 2009

Во-первых, я бы получил хороший список слов. Эта страница NPL имеет хороший список списков слов разных размеров и источников. То, что я хотел бы сделать, это создать хэш-таблицу всех слов в списке слов, а затем проверить каждое слово, которое выводится с помощью strings, против списка слов. Это довольно легко сделать в Python:

import sys

dictfile = open('your-word-list')
wordlist = frozenset(word.strip() for word in dictfile)
dictfile.close()

for line in sys.stdin:
    # if any word in the line is in our list, print out the whole line
    for word in line.split():
        if word in wordlist:
            print line
            break

Тогда используйте это так:

strings myexecutable.elf | python myscript.py

Однако я думаю, что вы сосредоточили свое внимание не на том месте. Исключение строк отладки имеет очень убывающую отдачу. Хотя устранение отладочных данных является требованием технической сертификации, которого требует от вас Nintendo, я не думаю, что они откажутся от того, что в вашем ELF есть пара дополнительных строк.

Используйте профилировщик и попытайтесь определить, где вы используете больше всего памяти. Скорее всего, будет способ сэкономить огромное количество памяти без особых усилий, если вы сосредоточите свою энергию в нужном месте.

0 голосов
/ 31 мая 2009

Это звучит как идеальная задача для быстрого и грязного скрипта в чем-то, поддерживающем регулярные выражения. Я бы, наверное, очень быстро что-то сделал в python, если бы это был я.

Вот как бы я поступил: Каждый раз, когда вы сталкиваетесь со строкой (из выходных данных strings.exe), подсказывайте пользователю, хотят ли они запомнить его в словаре или навсегда игнорировать. Если пользователь решает навсегда игнорировать строку, в будущем, когда она встретится, не запрашивайте ее и не выбрасывайте. При желании вы можете сохранить файл анти-словаря, чтобы запомнить его для будущих запусков вашего скрипта. Создайте файл словаря и для каждой строки сохраните счетчик или любую другую информацию о нем, которая вам нужна. При желании можно отсортировать по количеству встреч строки, чтобы вы могли сосредоточиться на самых вопиющих нарушителях.

Это звучит как идеальная задача для изучения языка сценариев. Я бы не стал возиться с C # / C ++ или с чем-то по-настоящему причудливым для реализации этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...