Найти - Пользователи
Полная версия: Сравнение времени считывания файлов
Начало » Python для экспертов » Сравнение времени считывания файлов
1
grok
Доброго времени суток, уважаемые форумчане. Появилось желание протестировать на сколько быстрее считывать файлы из оперативной памяти используя 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)
Ed
Если файлы небольшие, то они у вас скорее всего в кэше уже. А у мемкэша накладные расходы на коннект и передачу по tcp или что он там использует.
grok
Ed
Если файлы небольшие, то они у вас скорее всего в кэше уже.
Для этого я и делал
os.system('sync') # для чистоты эксперимента
Ed
А у мемкэша накладные расходы на коннект и передачу по tcp или что он там использует.
Так и сеть. По умолчанию TCP стоит.

P.S. Вот эта команда все решила.
echo 3 > /proc/sys/vm/drop_caches
ОС ведь сама еще данные кэширует; вот эти то самые файлы и были в оперативе, поэтому тот эксперимент заведомо давал ложные данные.
Lexander
grok
Общее время считывания с диска: ~0.1 с.
31ГБ данных с диска за 0,1 сек? Сикоко-сикоко? :D

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

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

Lexander
grok
3146 файла, ~10Мб
31ГБ данных с диска за 0,1 сек? Сикоко-сикоко? :D
10Мб их общий объем, а не каждый =).
Lexander
grok
Я ведь выше уже разъяснил почему так вышло, нет?
Да, просто я не видел вашего сообщения.
Теперь возражений нет. :)
cpu
Вы не так юзаете мемкеш.

# -*- 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.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB