Кажется, есть проблема со сборкой старых драйверов NVIDIA на ядрах 4.4.0-107x-aws. Вы можете установить более новые драйверы NVIDIA, которые должны нормально работать с текущим ядром:
wget http://us.download.nvidia.com/tesla/410.104/NVIDIA-Linux-x86_64-410.104.run
sudo sh ./NVIDIA-Linux-x86_64-410.104.run --no-drm --disable-nouveau --dkms --silent --install-libglvnd
По словам представителя AWS, драйверы были обновлены в Deep Learning AMI 21/03/2019 [ Форумы AWS ].
rows = list(myreader)
totalrows = len(rows)
for i, row in enumerate(rows):
print("Row %d/%d" % (i+1, totalrows))
Вам нужно открыть файл только один раз:
import csv
f = open('myFile.csv', 'rb')
countrdr = csv.DictReader(f)
totalrows = 0
for row in countrdr:
totalrows += 1
f.seek(0) # You may not have to do this, I didn't check to see if DictReader did
myreader = csv.DictReader(f)
for row in myreader:
do_work
Независимо от того, что вы делаете, вы должны сделать два прохода (ну, если ваши записи имеют фиксированную длину - что маловероятно - вы могли бы просто получить размер файла и разделить, но давайте предположим, что это не так). Повторное открытие файла на самом деле не стоит больших затрат, но вы можете избежать его, как показано здесь. Преобразование в список только для использования len()
может привести к потере тонн памяти и не будет быстрым.
Примечание: «Pythonic» - это использование enumerate
вместо +=
, но код операции UNPACK_TUPLE
настолько дорог, что делает enumerate
медленнее, чем увеличение локального. При этом, вероятно, вам следует избегать ненужной микрооптимизации.
Дополнительные примечания: Если вы действительно хотите сгенерировать какой-то индикатор прогресса, он не обязательно должен основываться на записях. Вы можете tell()
на объекте file в цикле и просто сообщить, через какой% данных вы прошли. Это будет немного неравномерно, но есть вероятность того, что для любого файла, который достаточно большой, чтобы гарантировать индикатор выполнения, отклонение длины записи будет потеряно из-за шума.
Я не могу найти, как скопировать итератор.
Ближайшим является itertools.tee , но просто сделать list
из него, как предполагает @JFSebastian, здесь лучше, как объясняют документы itertools.tee:
Для этого itertool может потребоваться значительное вспомогательное хранилище (в зависимости от того, сколько временных данных необходимо сохранить). В общем, если один итератор использует большую часть или все данные до запуска другого итератора, быстрее использовать
list()
вместоtee()
.