2016-02-11 3 views
2

Я пишу программу для тестирования моего диска. Я вычисляю время, необходимое для записи файла и чтения из файла на диске.Как очистить кэш?

Моей функция FILE_READ выглядит следующим образом:

def read(blockSize): #blockSize is in bytes, varies from 1 byte, 1 KB and 1 MB 
    loops = 1048576 * fileSize/blockSize #number of iterations, fileSize is 100 (Mb) 
    fp = open("foo.txt", "r") 
    for j in xrange(0, loops): 
     fp.read(blockSize) 
    fp.close() 

Пропускной Я расчет очень высокий (около 2 Гб). Я подозреваю, что это связано с тем, что файл хранится в моей кеш-памяти. Есть ли способ, чтобы я мог очистить его, чтобы эффективно сравнивать мой диск?

ответ

2

Об Linux, you can explicitly write to a special file to force the page cache to be cleared.

Чтобы сделать это в Python (из-за запуска программы, чтобы сделать это стоило бы тоже много), вы могли бы сделать:

# On Python 3.3+, you can force a sync to disk first, minimizing the amount of 
# dirty pages to drop as much as possible: 
os.sync() 

with open('/proc/sys/vm/drop_caches', 'w') as f: 
    f.write("1\n") 

Убедитесь, что вы не держите открытыми ручками в файл на время, когда вы это делаете; открытый дескриптор файла может помешать кешу для его удаления.

Другая возможность, которая может работать, заключается в использовании posix_fadvise, чтобы лежать в систему, чтобы она удаляла страницы для вас; вы должны проверить, чтобы подтвердить, но вы можете быть в состоянии сделать что-то вроде:

def read(blockSize): #blockSize is in bytes, varies from 1 byte, 1 KB and 1 MB 
    loops = 1048576 * fileSize/blockSize #number of iterations, fileSize is 100 (Mb) 
    with open("foo.txt") as fp: 
     # Lies to OS to tell it we won't need any of the data 
     os.posix_fadvise(fp.fileno(), 0, fileSize, os.POSIX_FADV_DONTNEED) 
     # Changed our mind! Read it fresh 
     os.posix_fadvise(fp.fileno(), 0, fileSize, os.POSIX_FADV_NORMAL) 

     for j in xrange(loops):    
      fp.read(blockSize) 

Как os.sync, то API Python не был введен до 3.3, так что вам нужно свернуть свой собственный аксессор с ctypes на более ранних версиях. Также обратите внимание, что, как написано, ваш код никогда не обращается к началу файла, но читает гораздо больше данных, чем содержит файл. Возможно, вы хотели вернуться к началу? Вам нужно будет повторно посоветовать перед каждым поиском назад.

Смежные вопросы