Я использую следующий код для чтения в цикле из заданного количества файлов постоянного размера. Все файлы для чтения существуют, и чтение успешно.
Понятно, что изменение размера файла влияет на fMBPerSecond
потому что при чтении файлов, которые меньше размера страницы, все еще читается вся страница. Тем не мение, nNumberOfFiles
оказывает влияние на fMBPerSecond
а также то, чего я не понимаю. Видимо, это не nNumberOfFiles
само по себе, что имеет эффект, но это продукт nNumberOfFiles * nFileSize
,
Но почему это должно иметь эффект? Файлы открываются / читаются / закрываются последовательно в цикле.
Я проверял с nFileSize = 65536
, При выборе nNumberOfFiles = 10000
(или меньше) я получаю что-то вокруг fMBPerSecond = 500 MB/s
, С nNumberOfFiles = 20000
Я получаю что-то вокруг fMBPerSecond = 100 MB/s
, что является резкой потерей производительности.
О, и я должен упомянуть, что очищаю кеш диска перед чтением, выполнив:
sudo sync
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
Любые идеи о том, что происходит здесь за кулисами, будут приветствоваться.
Pedram
void Read(int nFileSize, int nNumberOfFiles)
{
char szFilePath[4096];
unsigned char *pBuffer = new unsigned char[nFileSize];
Helpers::get_timer_value(true);
for (int i = 0; i < nNumberOfFiles; i++)
{
sprintf(szFilePath, "files/test_file_%.4i", i);
int f = open(szFilePath, O_RDONLY);
if (f)
{
if (read(f, pBuffer, (ssize_t) nFileSize) != (ssize_t) nFileSize)
printf("error: could not read file '%s'\n", szFilePath);
close(f);
}
else
{
printf("error: could not open file for reading '%s'\n", szFilePath);
}
}
const unsigned int t = Helpers::get_timer_value();
const float fMiliseconds = float(t) / 1000.0f;
const float fMilisecondsPerFile = fMiliseconds / float(nNumberOfFiles);
const float fBytesPerSecond = 1000.0f / fMilisecondsPerFile * float(nFileSize);
const float fMBPerSecond = fBytesPerSecond / 1024.0f / 1024.0f;
printf("t = %.8f ms / %.8i bytes - %.8f MB/s\n", fMilisecondsPerFile,
nFileSize, fMBPerSecond);
delete [] pBuffer;
}
Существует несколько моделей твердотельных накопителей, особенно более дорогих моделей центров обработки данных, которые сочетают внутренний кэш DRAM с (более медленными) постоянными ячейками NAND. Пока данные, которые вы читаете, помещаются в кэш DRAM, вы получите более быстрый ответ.
Других решений пока нет …