На одному з проектів була потреба працювати з величезною кількістю файлів ( специфіка бази даних ), і аналогічно на додачу до того постійно створювалися тимчасові файли в великій кількості. Звичайно ж час життя цих всіх файлів жостко контролювався із пітончика :)
А ось тепер задачка - є приблизно 10 тисяч файликів , які потрібно прочитати ( по-чергово звісно ) опрацювати і видалити - який буде результуючий перфоменс ? Ну ок, обробка інфи в файлах неважлива - ми нівелюємо цей аспект:) Ну ок - про читання теж саме ( хоча там теж є свої особливості... Я ось більше про саму операцію ремув питаю - як думаєте наскільки вона впливає на перфоменс?
Давайте візьмем маленький приклад - ремувати будемо ось так
але для великої кількості файлів - кількадесять тисяч, чи буде це гарним варіантом?
берем генерим для прикладу дві тисячі файлів, заходимо в директорію до файлів
і виконуємо скрипт:
і в результаті отримуємо
0.551357030869
в принціпі небагато
Для прикладу можемо порівняти з більш низькорівнемої функцією - unlink
Та сама вибірка і кількість файлів, виконуємо скриптец
результат:
0.733736991882
Типу все круто - і гарно працює, але насправді нам було того мало , і ми вирішили збілдати Cython екстеншин для покращення перфоменсу , ( на цьому , ну і не тільки на цьому місці (^_^) )
і при використанні коду скомпільованого з використанням os.remove(), отримав такі дані
0.779083967209
але найбільше здивував posix.unlink() , бо він виявився в 10 разів швидший
0.0869176957216
!!
Отже при викоритсанні низкорівневих штук з cython тільки на одному видаленні файлів отримав досить значне зростання перфоменсу, а як то кажуть - "Копійка гривню береже". Тут вдосконалили і можемо переміститися на іншу аспект покращення перфоменсу (=
UPD. правда то все я тестив на ssd - тому на вінчестері звичайному можуть відрізнятися числа =(
А ось тепер задачка - є приблизно 10 тисяч файликів , які потрібно прочитати ( по-чергово звісно ) опрацювати і видалити - який буде результуючий перфоменс ? Ну ок, обробка інфи в файлах неважлива - ми нівелюємо цей аспект:) Ну ок - про читання теж саме ( хоча там теж є свої особливості... Я ось більше про саму операцію ремув питаю - як думаєте наскільки вона впливає на перфоменс?
Давайте візьмем маленький приклад - ремувати будемо ось так
import os os.remove(path/to/file)
але для великої кількості файлів - кількадесять тисяч, чи буде це гарним варіантом?
берем генерим для прикладу дві тисячі файлів, заходимо в директорію до файлів
і виконуємо скрипт:
from os import remove
from os import listdir
from time import time
start = time()
for item in listdir('.'):
remove(item)
print time() - start
і в результаті отримуємо
0.551357030869
в принціпі небагато
Для прикладу можемо порівняти з більш низькорівнемої функцією - unlink
Та сама вибірка і кількість файлів, виконуємо скриптец
from posix import unlink
from os import listdir
from time import time
start = time()
for item in listdir('.'):
unlink(item)
print time() - start
результат:
0.733736991882
Типу все круто - і гарно працює, але насправді нам було того мало , і ми вирішили збілдати Cython екстеншин для покращення перфоменсу , ( на цьому , ну і не тільки на цьому місці (^_^) )
і при використанні коду скомпільованого з використанням os.remove(), отримав такі дані
0.779083967209
але найбільше здивував posix.unlink() , бо він виявився в 10 разів швидший
0.0869176957216
!!
Отже при викоритсанні низкорівневих штук з cython тільки на одному видаленні файлів отримав досить значне зростання перфоменсу, а як то кажуть - "Копійка гривню береже". Тут вдосконалили і можемо переміститися на іншу аспект покращення перфоменсу (=
UPD. правда то все я тестив на ssd - тому на вінчестері звичайному можуть відрізнятися числа =(

0 comments:
Post a Comment