2014-09-25 3 views
4

Я получаю большое количество данных по фиксированной ставке. Мне нужно сделать некоторую обработку этих данных в другом потоке, но это может работать медленнее, чем данные поступают, поэтому мне нужно буферизовать данные. Из-за количества данных, поступающих в доступную ОЗУ, будет быстро исчерпано, поэтому он должен переполняться на жесткий диск. То, что я могу сделать, - это что-то вроде файла с поддержкой файловой системы, поэтому писатель может быть заблокирован файловой системой, но не слишком медленным.Буферизация на жесткий диск

Вот приблизительный набор требований:

  • Запись не должна быть заблокирована читателем работает слишком медленно.
  • Если данные считаются достаточно медленными, чтобы освобожденная ОЗУ была исчерпана, она должна переполняться в файловую систему. Это нормально для записи на диск для блокировки.
  • Чтение должно блокироваться, если данные отсутствуют, если поток не был закрыт писателем.
  • Если читатель может идти в ногу с данными, он никогда не должен попадать на жесткий диск, поскольку буфер ОЗУ будет достаточным (приятным, но не существенным).
  • Место на диске должно быть восстановлено по мере того, как данные будут потребляться (или вскоре после этого).

Существует ли такой механизм в Windows?

+0

Попробуйте написать свою программу без буферизации hd и посмотреть, хорошо ли она работает с диспетчером памяти Windows. –

+0

С количеством данных, которые мы получаем, мы просто слишком быстро закончим пространство, чтобы это сработало. У нас также закончится адресное пространство, так как мы застряли на 32-битной машине. – spencercw

+1

Попробуйте сопоставить файлы Windows. Его довольно хорошо справляется с обменом данными с ram на hdd, здесь находится сайт msdn: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556%28v=vs.85%29.aspx – Flocke

ответ

1

Это выглядит как классическая очередь сообщений. Вы рассматривали MSMQ или подобное? У MSMQ есть все свойства, о которых вы просите. Вы можете использовать прямую адресацию, чтобы избежать использования Active Directory http://msdn.microsoft.com/en-us/library/ms700996(v=vs.85).aspx и использовать локальный адрес или адрес очереди TCP/IP.

0

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

Вы даже получаете дополнительные преимущества без многопоточности.

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