Об 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
на более ранних версиях. Также обратите внимание, что, как написано, ваш код никогда не обращается к началу файла, но читает гораздо больше данных, чем содержит файл. Возможно, вы хотели вернуться к началу? Вам нужно будет повторно посоветовать перед каждым поиском назад.