Форум сайта python.su
Доброго времени суток, уважаемые форумчане. Появилось желание протестировать на сколько быстрее считывать файлы из оперативной памяти используя memcache (pylibmc) нежели считывать их непосредственно с жесткого диска. В моем случае я проходил по дереву каталога (3146 файла, ~10Мб). Код тестов приведен ниже. В итоге получилось, что считать файлы с диска получилось быстрее, чем с оперативной памяти. Подскажите, где моя ошибка? Знаний похоже не хватает..
Общее время считывания с диска: ~0.1 с.
Общее время считывания с оперативы: ~0.9 с.
Спасибо.
import pylibmc, os from time import time def test_hard_disk(): time1 = time() for path, dirnames, filenames in os.walk('some_directory'): for _file in filenames: open(os.path.join(path, _file), 'r').read() time2 = time() print time2 - time1 def fill_memory(mc): i = 0 for path, dirnames, filenames in os.walk('some_directory'): for _file in filenames: mc.set(str(i), open(os.path.join(path, _file), 'r').read(), 0) i += 1 def test_memory(mc): time1 = time() for i in xrange(3146): mc.get(str(i)) time2 = time() print time2 - time1 os.system('sync') # для чистоты эксперимента test_hard_disk() mc = pylibmc.Client(['127.0.0.1'], binary=True, behaviors={'tcp_nodelay': True}) fill_memory(mc) test_memory(mc)
Отредактировано grok (Июнь 15, 2012 10:12:01)
Офлайн
Если файлы небольшие, то они у вас скорее всего в кэше уже. А у мемкэша накладные расходы на коннект и передачу по tcp или что он там использует.
Офлайн
EdДля этого я и делал
Если файлы небольшие, то они у вас скорее всего в кэше уже.
os.system('sync') # для чистоты эксперимента
EdТак и сеть. По умолчанию TCP стоит.
А у мемкэша накладные расходы на коннект и передачу по tcp или что он там использует.
echo 3 > /proc/sys/vm/drop_caches
Офлайн
grok31ГБ данных с диска за 0,1 сек? Сикоко-сикоко? :D
Общее время считывания с диска: ~0.1 с.
Офлайн
LexanderЯ ведь выше уже разъяснил почему так вышло, нет?
В общем, я очень сильно сомневаюсь в результатах теста.
Lexander10Мб их общий объем, а не каждый =).grok31ГБ данных с диска за 0,1 сек? Сикоко-сикоко? :D
3146 файла, ~10Мб
Отредактировано grok (Июнь 15, 2012 12:09:02)
Офлайн
grokДа, просто я не видел вашего сообщения.
Я ведь выше уже разъяснил почему так вышло, нет?
Отредактировано Lexander (Июнь 15, 2012 13:53:00)
Офлайн
Вы не так юзаете мемкеш.
# -*- coding: utf-8 -*- import pylibmc, os from time import time folder = '/tmp/mc_test/' test_range = 500000 # и это еще не экстрим... def fill_data(mc): time1 = time() # заполняем ФС и МС данными value = '0'*1024 # 1 KB данных for x in xrange(test_range): key = str(x) fh = open(os.path.join(folder, key), 'w') fh.write(value) fh.close() mc.set(key, value) time2 = time() print 'fill: ', time2 - time1 def test_fs(): time1 = time() for x in xrange(test_range): key = str(x) value = open(os.path.join(folder, key), 'r').read() time2 = time() print 'fs: ', time2 - time1 def test_mc(mc): time1 = time() for x in xrange(test_range): key = str(x) value = mc.get(key) time2 = time() print 'mc: ', time2 - time1 os.system('sync') # для чистоты эксперимента mc = pylibmc.Client(['127.0.0.1'], binary=True, behaviors={'tcp_nodelay': True}) fill_data(mc) test_fs() test_mc(mc)
fill: 210.708712101
fs: 224.442557096
mc: 51.7425580025
Отредактировано cpu (Июнь 18, 2012 01:52:04)
Офлайн