Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 15, 2012 09:51:36

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение времени считывания файлов

Доброго времени суток, уважаемые форумчане. Появилось желание протестировать на сколько быстрее считывать файлы из оперативной памяти используя 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)

Офлайн

#2 Июнь 15, 2012 10:13:05

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Сравнение времени считывания файлов

Если файлы небольшие, то они у вас скорее всего в кэше уже. А у мемкэша накладные расходы на коннект и передачу по tcp или что он там использует.



Офлайн

#3 Июнь 15, 2012 10:57:10

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение времени считывания файлов

Ed
Если файлы небольшие, то они у вас скорее всего в кэше уже.
Для этого я и делал
os.system('sync') # для чистоты эксперимента
Ed
А у мемкэша накладные расходы на коннект и передачу по tcp или что он там использует.
Так и сеть. По умолчанию TCP стоит.

P.S. Вот эта команда все решила.
echo 3 > /proc/sys/vm/drop_caches
ОС ведь сама еще данные кэширует; вот эти то самые файлы и были в оперативе, поэтому тот эксперимент заведомо давал ложные данные.



Офлайн

#4 Июнь 15, 2012 11:11:24

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Сравнение времени считывания файлов

grok
Общее время считывания с диска: ~0.1 с.
31ГБ данных с диска за 0,1 сек? Сикоко-сикоко? :D

Мэмкеш довольно легко выполняет 20тыс. операций в секунду.
При наличии достаточного объема памяти. У вас сколько оперативной памяти?

В общем, я очень сильно сомневаюсь в результатах теста.



Офлайн

#5 Июнь 15, 2012 11:58:28

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение времени считывания файлов

Lexander
В общем, я очень сильно сомневаюсь в результатах теста.
Я ведь выше уже разъяснил почему так вышло, нет?

Lexander
grok
3146 файла, ~10Мб
31ГБ данных с диска за 0,1 сек? Сикоко-сикоко? :D
10Мб их общий объем, а не каждый =).



Отредактировано grok (Июнь 15, 2012 12:09:02)

Офлайн

#6 Июнь 15, 2012 13:52:42

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Сравнение времени считывания файлов

grok
Я ведь выше уже разъяснил почему так вышло, нет?
Да, просто я не видел вашего сообщения.
Теперь возражений нет. :)



Отредактировано Lexander (Июнь 15, 2012 13:53:00)

Офлайн

#7 Июнь 18, 2012 01:49:25

cpu
От:
Зарегистрирован: 2011-12-29
Сообщения: 58
Репутация: +  1  -
Профиль   Отправить e-mail  

Сравнение времени считывания файлов

Вы не так юзаете мемкеш.

# -*- 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

С уважением, Ваш КО.
P.S.: Ах, да, юзал: питон 2.7, Семпрон 1800+, 2 гб памяти, убунта 10.04.



Отредактировано cpu (Июнь 18, 2012 01:52:04)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version