Я думаю, что у меня утечка памяти в моем скрипте Python

1

Это мой код:

from xgoogle.search import GoogleSearch, SearchError
import urllib, urllib2, sys, argparse

global stringArr

stringArr = ["string 1",
             "string 2",
             "string 3",
             "string etc"]

def searchIt(url):
    try:
        if(args.verbose>='1'): print "[INFO] Opening URL: "+url
        response = urllib.urlopen(url)
    except urllib2.URLError, e:
        print "[ERROR] "+e.reason
        return False
    except KeyboardInterrupt:
        print "Suspended by user..."
        sys.exit()
    if(checkForStr(response.read())):
        if(args.verbose=='0'): print "[INFO] String found in URL: "+url
    else:
        if(args.verbose>='1'): print "[INFO] No string found in URL: "+url

def checkForStr(html):
    global stringArr
    try:
        if any(checkStr in html for checkStr in stringArr):
            return True
        else:
            return False
    except KeyboardInterrupt:
        print "Suspended by user..."
        sys.exit()

def main():
    try:
        i=0
        gs = GoogleSearch(args.keyword)
        gs.results_per_page = 100
        results = []
        while True:
            tmp = gs.get_results()
            i = i+1 # page number
            if not tmp: # no more results (pages) were found
                break
            results.extend(tmp)
            for r in results: # process results for page
                searchIt(r.url) # check for string
            del results[:] # clean results
        # finished
    except SearchError, e:
        print "[ERROR] Search failed: %s" % e
    except KeyboardInterrupt:
        print "Suspended by user..."
        sys.exit()

if __name__ == '__main__':
    try:
        parser = argparse.ArgumentParser()
        parser.add_argument('-v', dest='verbose', default='0', help='Verbosity level', choices='012')
        group = parser.add_argument_group('required arguments')
        group.add_argument('-k', dest='keyword', help='Keyword to use on google query', required=True)
        args = parser.parse_args()
        main()
    except KeyboardInterrupt:
        print "Suspended by user..."
        sys.exit()

Я немного сократил его, чтобы было легче читать, но он все равно должен быть функциональным. Этот код будет частью более крупного script.

Я использую эту lib: XGOOGLE, чтобы очистить результаты от google, а затем я нахожу каждый результат для поиска, если веб-сайт содержит любую строку из stringArr.

Я сделал первые тесты без каких-либо проблем (я ctrl + C это после менее 10 результатов), но в первый раз, когда я позволил ему запустить, после того, как около 100 проверенных URL-адресов я получил эту ошибку:

  File "./StringScan.py", line 99, in <module>
    main()
  File "./StringScan.py", line 83, in main
    checkForStr(r.url)
  File "./StringScan.py", line 39, in checkForStr
    response = urllib.urlopen(url)
  File "/usr/lib/python2.6/urllib.py", line 86, in urlopen
    return opener.open(url)
  File "/usr/lib/python2.6/urllib.py", line 205, in open
    return getattr(self, name)(url)
  File "/usr/lib/python2.6/urllib.py", line 344, in open_http
    h.endheaders()
  File "/usr/lib/python2.6/httplib.py", line 904, in endheaders
    self._send_output()
  File "/usr/lib/python2.6/httplib.py", line 776, in _send_output
    self.send(msg)
  File "/usr/lib/python2.6/httplib.py", line 735, in send
    self.connect()
  File "/usr/lib/python2.6/httplib.py", line 716, in connect
    self.timeout)
  File "/usr/lib/python2.6/socket.py", line 500, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
IOError: [Errno socket error] [Errno -2] Name or service not known

(номера строк не совпадают, потому что я изменил код, чтобы опубликовать его здесь)

После этого я вернул свой терминал linux, как если бы script закончил. Но я заметил, что мой компьютер работает не очень хорошо, я проверил System Monitor и увидел, что процесс Python использует 1,3 ГБ памяти, мне пришлось убить процесс, чтобы вернуть свой компьютер в нормальное состояние.

Является ли это чем-то в моем коде, который вызывает это или почему это может произойти?

Я знаю, что мой код может иметь некоторые ошибки, но сейчас меня интересует всякая ошибка, которая может вызвать проблемы с памятью. Любая помощь будет оценена.

  • 0
    если x: вернуть True \ else: вернуть False - Рад, что мы получили эти логические значения, а?
  • 0
    global stringArr делает не то, что вы думаете, вам не нужны эти строки вообще
Показать ещё 3 комментария
Теги:
memory-leaks
memory

2 ответа

0
Лучший ответ

Я немного пересмотрел ваш код, чтобы мне было легче читать. Я ничего не вижу здесь, чтобы утечка памяти, хотя

from itertools import count
import urllib, urllib2, sys, argparse
from xgoogle.search import GoogleSearch, SearchError

stringArr = ["string 1",
             "string 2",
             "string 3",
             "string etc"]

def searchIt(url):
    try:
        if(args.verbose>='1'):
            print "[INFO] Opening URL: "+url
        response = urllib.urlopen(url)
    except urllib2.URLError, e:
        print "[ERROR] "+e.reason
        return False
    if checkForStr(response.read()):
        if(args.verbose=='0'):
            print "[INFO] String found in URL: "+url
    else:
        if(args.verbose>='1'):
            print "[INFO] No string found in URL: "+url

def checkForStr(html):
    return any(checkStr in html for checkStr in stringArr)

def main():
    try:
        gs = GoogleSearch(args.keyword)
        gs.results_per_page = 100
        for i in count():
            results = gs.get_results()
            if not results: # no more results (pages) were found
                break
            for r in results: # process results for page
                searchIt(r.url) # check for string
        # finished
    except SearchError, e:
        print "[ERROR] Search failed: %s" % e

if __name__ == '__main__':
    try:
        parser = argparse.ArgumentParser()
        parser.add_argument('-v', dest='verbose', default='0', help='Verbosity level', choices='012')
        group = parser.add_argument_group('required arguments')
        group.add_argument('-k', dest='keyword', help='Keyword to use on google query', required=True)
        args = parser.parse_args()
        main()
    except KeyboardInterrupt:
        print "Suspended by user..."
        sys.exit()
  • 0
    Спасибо, я буду использовать ваш код для дальнейшего тестирования.
  • 0
    Я еще не уверен, но я думаю, что утечка произошла из-за другого приложения Python, которое я запустил, потому что мой скрипт показывался как scriptname.py, а высокая загрузка памяти была связана с процессом под названием Python. Я все еще получаю ошибку IOError в моем скрипте, но я думаю, что это еще одна проблема. Вы знаете, как я могу удалить этот вопрос?
0

Это может быть urllib.urlopen(). См. http://bugs.python.org/issue1208304

Ещё вопросы

Сообщество Overcoder
Наверх
Меню