Столкнулся с проблемой:
К интернет-магазину подключены несколько feed от поставщиков. Плагин загружает изображения в высоком разрешении. Wordpress их конечно обрабатывает, генерируя уменьшенные копии, но оставляет оригинал.
Немного поработав, плагин загрузил изображений столько, что пришлось перейти на следующий тариф хостинга. Поработав еще, новое пространство заполнилось тоже. Поэтому начал искать решение, не прибегая к повышению тарифного плана.
Пробовал воспользоваться утилитой mogrify -resize из пакета Imagemagick, но в директории более 350 тысяч изображений, во время работы, регулярно выбивает из-за нехватки лимита процессорного времени. Стало ясно, что нужно где то хранить состояние. Позже стало понятно, что тратить время на обработку тех файлов что сгенерировал Wordpress не имеет смысла, они все равно не обрабатываются, а время и память тратиться (код сохраняет список файлов каждые 50 проходов).
Написал программу, заодно и подучил python.
Во время работы программы, столкнулся с ошибкой -
libgomp: Thread creation failed: Resource temporarily unavailable
Сервер не дает работать в несколько потоков. Решение очень простое, если знать его заранее - изменение в терминале или .bashrc переменной окружения export OMP_NUM_THREADS=1
Команда ограничивает количество потоков для Imagemagick.
import os
import time
import shutil
import sys
start = time.time()
def reset():
current_filelist = 'filelist_current.txt'
filelist = 'files.txt'
if os.path.exists(current_filelist):
print(current_filelist + " был найден")
try:
os.remove(current_filelist)
except:
print(current_filelist + ' не найден')
try:
os.remove(filelist)
except:
print(filelist + ' не найден')
print('Удалены файлы files.txt и filelist_current.txt')
def setup(filename = 'files.txt'):
filename = 'files.txt'
with open(filename, 'w') as file:
files = os.listdir()
workFiles = 0
for f in files:
if '.jpg' in f:
if (os.path.getsize(f) / (1024*1024)) > 1:
print(f + ' - > мегабайта, надо исправить!')
file.write(f + '\n')
workFiles += 1
print(str(len(files)) + ' всего изображений / ' + str(workFiles) + ' - для обработки. Список сохранен в файле ' + filename)
def resize(size):
width = size
filename = 'files.txt'
current_file = 'filelist_current.txt'
try:
with open(current_file, 'r') as file:
print(current_file + ' найден, продолжаю работы.')
except:
shutil.copyfile(filename, current_file)
print(current_file + ' - не найден. Создается новый!')
finally:
filename = current_file
newlines = []
def resizefile(file):
os.system('mogrify -resize "'+str(width)+'x>" ' + file)
print(file + ' - resized!')
with open(filename, 'r') as file:
lines = [line.rstrip() for line in file.readlines()]
if len(lines) == 0:
exit("Файл пустой, работа выполнена!")
i = 0
newlines.extend(lines)
for line in lines:
resizefile(line)
newlines.remove(line)
# time.sleep(1)
i += 1
if i % 50 == 0:
with open(current_file, 'w') as wfile:
for l in newlines:
wfile.write(l + '\n')
print('Список сохранен')
with open(current_file, 'w') as wfile:
for l in newlines:
wfile.write(l + '\n')
if 'setup' in sys.argv:
print('Создание нового списка файлов')
if len(sys.argv) > 2:
setup(sys.argv[2])
else:
setup()
elif 'resize' in sys.argv:
print('Выполнение ресайза изображений')
resize(sys.argv[2])
elif 'reset' in sys.argv:
reset()
end = time.time() - start
print(end)