Остановка скрипта во время выполнения - PullRequest
0 голосов
/ 16 июня 2020

Я проверяю наличие сбоев миграции данных в своей базе данных, и хотя мой Python скрипт отлично работает с меньшим объемом данных, в настоящее время он останавливается в середине выполнения. Cmd все еще находится в состоянии выполнения, но, похоже, не работает в какой-то момент, и мне нужно вручную прервать его, используя Ctrl + C.

Код и комментарии ниже:

import collections
import csv

a=[]

with open('FailedIds.txt') as my_file:
    for line in my_file:
        a.append(line) #builds array of unique row IDs that failed in migration. Contains 680k rows.

with open("OldDbAll.txt", 'r') as f:
    l = list(csv.reader(f))
    dict = {i[0]:[(x) for x in i[1:]] for i in zip(*l)} #builds dictionary containing all rows and columns from our old DB, key = column header, values = arrays of values. Contains 3 million rows and 9 columns, 200MB in file size.

string=''
print("Done building dictionary")

with open('Fix.txt', 'w') as f:
  print(",".join(dict.keys()),file=f)
  for i in range(len(dict['UNIQUEID'])):
    for j in range(len(a)):
      if a[j].strip()==dict['UNIQUEID'][i]: #matching failure row ID to the dictionary unique ID array
        for key in dict:
          string+=dict[key][i]+"," #prints the data to be re-migrated
        print(string,file=f)
        string=''

Когда я впервые запустил этот сценарий ночью, у меня было около 50 тысяч строк после ручного прерывания сценария python. Я думал, что это нормально, потому что мой компьютер мог перейти в спящий режим. Однако сегодня утром я получил 1k строк после того, как прогнал скрипт вчера и до ночи. Я планирую перезагрузить компьютер и в следующий раз настроить его, чтобы он не переходил в спящий режим, но я хотел бы получить все 600 тыс. + Строк в качестве выходных данных, и в настоящее время я не приблизился к этой сумме.

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

1 Ответ

1 голос
/ 16 июня 2020

Я считаю, что l oop является причиной того, что ваш код так долго запускается:

for key in dict:
  string+=dict[key][i]+"," #prints the data to be re-migrated
print(string,file=f)
string=''

Объединение строк медленное , и это l oop выполняет лот из этого.

Я не думаю, что вам вообще нужно объединять - просто напишите в файл, как вы go:

for key in dict:
  f.write(dict[key][i]+",")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...