Чтение файла по сети замедляется из-за дополнительных чтений

Я читаю файл и меня любое чтение строка данных (последовательные чтения 1600 года 17 байтов) или столбец данных (чтения 1600 года 17 байтов, разделенных 1600*17=27,200 байты). Файл или на локальном диске или на удаленном диске. Я делаю чтения 10 раз, таким образом, я ожидаю в каждом случае читать в 272 000 байтов данных.

На локальном диске я вижу то, что я ожидаю. На удаленном диске при чтении последовательно я также вижу то, что я ожидаю, но при чтении столбца, я вижу тонну дополнительных сделанных чтений. Они 32 768 байтов длиной и, кажется, не используются, но они делают объем данных считанным, спрыгивают с 272 000 байтов к где угодно от 79 МБ до 106 МБ. Вот выходной Монитор Процесса использования:

1:39:39.4624488 PM  DiskSpeedTest.exe   89628   ReadFile    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,390,069, Length: 17
1:39:39.4624639 PM  DiskSpeedTest.exe   89628   FASTIO_CHECK_IF_POSSIBLE    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,390,069, Length: 17
1:39:39.4624838 PM  DiskSpeedTest.exe   89628   ReadFile    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,388,032, Length: 32,768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal
1:39:39.4633839 PM  DiskSpeedTest.exe   89628   ReadFile    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,417,269, Length: 17
1:39:39.4634002 PM  DiskSpeedTest.exe   89628   FASTIO_CHECK_IF_POSSIBLE    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,417,269, Length: 17
1:39:39.4634178 PM  DiskSpeedTest.exe   89628   ReadFile    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,444,469, Length: 17
1:39:39.4634324 PM  DiskSpeedTest.exe   89628   FASTIO_CHECK_IF_POSSIBLE    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,444,469, Length: 17
1:39:39.4634529 PM  DiskSpeedTest.exe   89628   ReadFile    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,441,280, Length: 32,768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal
1:39:39.4642199 PM  DiskSpeedTest.exe   89628   ReadFile    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,471,669, Length: 17
1:39:39.4642396 PM  DiskSpeedTest.exe   89628   FASTIO_CHECK_IF_POSSIBLE    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,471,669, Length: 17
1:39:39.4642582 PM  DiskSpeedTest.exe   89628   ReadFile    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,498,869, Length: 17
1:39:39.4642764 PM  DiskSpeedTest.exe   89628   FASTIO_CHECK_IF_POSSIBLE    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,498,869, Length: 17
1:39:39.4642922 PM  DiskSpeedTest.exe   89628   ReadFile    \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,498,624, Length: 32,768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal

Заметьте дополнительные чтения 32 768 с набором Флагов ввода-вывода к некэшируемому, Подкачка страниц ввод-вывод, Синхронная Подкачка страниц ввод-вывод, Приоритет: Нормальный. Эти дополнительные чтения - то, что берет его от 272 КБ до 106 МБ и вызывает замедление. Их не происходит при чтении из локального файла или если я читаю строку, таким образом, это все последовательно.

Я попытался установить FILE_FLAG_RANDOM_ACCESS, но это, кажется, не помогает. Какие-либо идеи о том, что вызывает эти дополнительные чтения и как заставить их остановиться???

Тесты запускаются в системе Vista 64 битов. Я могу обеспечить исходный код для программы для демонстрации проблемы, а также консольной программы, которая делает тесты.

6
задан Brad Pepers 10 January 2010 в 20:55
поделиться

4 ответа

Вы могли бы сталкиваться с проблемами блокировки op по SMB. Обычно, когда чтение/сохранение файла по сетевым окнам остановится полный файл к работе с клиентами на нем и передаст изменения обратно. Когда вы работаете с базами данных на основе плоских файлов или файлами, это может вызвать ненужные чтения через долю файла SMB.

я не уверен, существует ли способ просто остановиться целый файл, считайте строки из того файла на локальной копии и затем пододвиньте изменения обратно или нет.

Вы считаете некоторые кошмары об уступающих блокировках и базах данных на основе плоских файлов.

http://msdn.microsoft.com/en-us/library/aa365433%28VS.85%29.aspx

Не уверенный, если это решает вашу проблему, но это могло бы получить вас, указал в правильном направлении. Удачи!

2
ответ дан 17 December 2019 в 07:04
поделиться

Я вижу это все время, и это выходит из вашего контроля: сеть делает то, что она хочет.

Если вы знаете, что файл будет меньше 1 МБ, просто потяните все в память.

0
ответ дан 17 December 2019 в 07:04
поделиться

Мое предположение Состоит в том, что ОС делает свою собственную читающую файл в результате шанса выключения, вам понадобятся данные в более позднем. Если это не повредит тебе, то это не должно иметь значения.

Проверьте Кэширование поведения Раздел CreateFile API.

Вы можете попробовать «file_flag_no_buffering», чтобы увидеть, останавливает ли он дополнительные чтения. Будьте предупредили, использование этого флага может замедлить ваше приложение вниз. Обычно вы используете этот флаг, если вы понимаете, как поток данных от диска как можно быстрее, и кэширование ОС только вступает в путь.

Также вы можете получить такое же поведение в качестве сетевого файла с локальными файлами, если вы используете флаг «File_Flag_sexental_scan». Этот флаг подсказки к менеджеру кеша Windows Cache, что вы будете делать, и постараюсь получить данные для вас заранее.

0
ответ дан 17 December 2019 в 07:04
поделиться

Я думаю, что вам нужно что-то, что позволяет динамически печатать/удалять/перезаписывать текст из окна терминала, например, как работают команды UNIX watch или top .

Я думаю, что в вашем случае вы бы напечатали «Prompt >», но затем, когда вы получите «Hello World», вы перезаписали «Prompt >» на «Hello World», а затем напечатали «Prompt >» в строке ниже. Я не думаю, что вы можете сделать это с обычной выводной печатью на терминале.

Возможно, вы сможете делать то, что хотите, используя библиотеку проклятий Python. Я никогда не использовал его, так что я не могу сказать вам, как решить вашу проблему (или если модуль даже сможет решить вашу проблему), но я думаю, что стоит взглянуть на. Поиск «python curses tutorial» предоставил документ в формате PDF , который кажется полезным.

-121--2913810-

Рассмотрим следующий пример:

my_pthread_mutex_lock( &m ) ;
someNonVolatileGlobalVar++ ;
my_pthread_mutex_unlock( &m ) ;

Функция my_pthread_mutex_lock () просто вызывает pthread_mutex_lock (). Используя my_pthread_mutex_lock (), я уверен, что компилятор не знает, что это функция синхронизации. Для компилятора это просто функция, и для меня это функция синхронизации, которую я могу легко повторить. Так как какое-либо значение NonExherductStartVar является глобальным, я ожидал, что компилятор не переместит какое-либо значение NonExherDoringStartVar++ за пределы критического раздела. Фактически, из-за наблюдаемого поведения , даже в ситуации с одним потоком, компилятор не знает, модифицирует ли функция до и после этой команды глобальный вариант. Итак, чтобы сохранить наблюдаемое поведение правильным, он должен сохранять порядок выполнения, как он записан. Надеюсь, что pthread_mutex_lock () и pthread_mutex_unlock () также выполнят аппаратные барьеры памяти, чтобы предотвратить перемещение аппаратных средств этой инструкции за пределы критического раздела.

Правильно ли я?

Если я пишу:

my_pthread_mutex_lock( &m ) ;
someNonVolatileGlobalVar1++ ;
someNonVolatileGlobalVar2++ ;
my_pthread_mutex_unlock( &m ) ;

я не могу знать, какая из двух переменных увеличивается сначала, но это обычно не проблема.

Если я пишу:

someGlobalPointer = &someNonVolatileLocalVar;
my_pthread_mutex_lock( &m ) ;
someNonVolatileLocalVar++ ;
my_pthread_mutex_unlock( &m ) ;

или

someLocalPointer = &someNonVolatileGlobalVar;
my_pthread_mutex_lock( &m ) ;
(*someLocalPointer)++ ;
my_pthread_mutex_unlock( &m ) ;

компилятор делает то, что ожидает изобретательный разработчик?

-121--1683757-

Я думаю, что SMB всегда передает блок, а не небольшой набор байтов.

Некоторые сведения о согласовании размера блока можно найти здесь. http://support.microsoft.com/kb/q223140

Таким образом, вы видите чтение для копирования соответствующего блока, за которым следуют локальные чтения 17 байтов внутри блока. (Если вы посмотрите на образец, есть несколько пар из 17 байтов чтения, где два чтения попадают в один блок).

Исправление, очевидно, зависит от контроля над приложением, а также от размера и структуры базы данных. (например, если база данных имеет один столбец на файл, то все операции чтения будут последовательными. Если бы вы использовали сервер базы данных, вы бы не использовали SMB и т.д.)

Если это утешение, iTunes работает отвратительно при использовании сетевого диска .

0
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: