2014-05-22 1 views
-1

У меня есть блок кода, который я использую для передачи файлов с компьютера моей мамы на свой компьютер через http. Сначала я индексирую файлы на моей системе мам, а затем сопоставляю их с файлами, присутствующими в моей системе, и если поиск не выполняется, он передает этот файл в мой sys.Оптимизация кода поиска python, сокращающего время выполнения

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

Я не знаю, что эта проблема является ее в моей сети или это с кодом

import requests 
import client_index 
import sever_index 
def transfer(url): 
    files = {'userfile': open(url, 'rb')} 
    tim = url.rsplit('/',1) 
    payload = { 'lnk' : tim[0], 'bp' : client_index.rootDir} 
    r = requests.post('http://192.168.1.3/upload_file.php',files=files,data=payload,stream=True)   
    print r.text  
    return 
def search(str): 
    found=0 
    with open("my.txt") as f: 
     for line in f: 

      if str==line: 
       found=1 
       return 
     if found==0: 
      print(str) 
      transfer(str[:-1]) 
    return 
c=0 

with open("my.txt") as fome: 
     for line in fome: 
      c=c+1 
if c==0: 
    with open("mom.txt") as fo: 
      for line in fo: 
       transfer(line[:-1]) 
else: 
    with open("mom.txt") as fo: 
     for line in fo: 
      search(line) 
+0

Почему бы вам просто не использовать rsync? Он делает все, что вам нужно, и довольно быстро. Что касается вашей проблемы, это может быть связано с вашей средой PHP. –

ответ

1

Вы открываете my.txt для каждого вызова search. В то время как вы должны открыть его один раз. Также вы должны оптимизировать поиск в списке файлов. Вы выполняете операцию O(N) для каждой записи в mom.txt, которая дает вам O(N*M). С помощью простого бинарного поиска вы можете сделать это намного быстрее O(M*log(N)). Или вы можете сделать set из my.txt, а затем поиск файла займет постоянное время. Более того, вы можете создавать наборы из обоих списков файлов, а затем просто вычитать один набор из другого.

Кстати, как я уже упоминал в комментарии, вы должны использовать rsync, если вы работаете в * nix env.

0

Вы можете использовать онлайн-резервное копирование Norton, вы можете взять резервную копию на 25 ГБ в пробной версии. Используя это, вы можете сделать резервную копию необходимых файлов с исходного ПК и восстановить его из Интернета на вашем целевом ПК. Ниже перечислены недостатки в использовании простых скриптов для передачи огромных файлов: 1. Как обрабатывать соединение падает между 2. Как вы возобновите работу после перезагрузки (если по какой-либо причине вы остановите свой компьютер) 3. Обязательно это займет много времени, по сравнению с онлайн-резервом Norton или rsync. 4. У вас не будет контроля над использованием процессора/памяти на ваших скриптах, это может замедлить работу вашего ПК.