2011-01-23 1 views
3

내 상황에 데이터를 기록하는 코드가없는 기존 상황이 있습니다. 매초마다 디스크. 매초마다 디스크에 기록 된 내용을 읽고 데이터를 사용하는 C# 프로그램이 있습니다. 데이터는 작성되기 전에 파일 이름을 알고있는 몇 개의 텍스트 파일에 기록됩니다.디스크에 쓰는 레거시 앱의 파일 IO 및 실시간으로 읽는 앱 (.NET)

문제는이 레거시 앱과 내 프로그램을 실행하는 가상 컴퓨터가 많다는 것입니다. 그들은 램이나 CPU에 의해 제한되지 않지만 파일 io 병목 현상으로 인해 머신 당 10 개 이상의 VM을 추가 할 수 없습니다.

램이나 다른 파일에있는 디스크에 파일을 만들 수있는 쉬운 방법이 있습니까? 명명 된 파이프가 옵션으로 들리는가?

감사합니다.

+0

항상 RAM 디스크를 사용할 수 있습니다. 당신이 질문에 그렇게 태그를 붙인 것을 봅니다. 그것은 당신이 하나를 창조하는 방법을 알고 싶기 때문입니까? 레거시 앱이 작성하는 파일의 경로를 지정할 수 있습니까? –

+1

VM이 문제를 일으킴으로써 파일 시스템 캐시 (메모리가 아닌 디스크)를 통해 데이터가 공유되는 것을 방지합니다. * one *을 사용하십시오. –

+0

레거시 앱이 쓰는 경로를 지정할 수 있으므로 램 디스크 만 설정할 수 있습니다. 더 쿨한 tho :-)를 기대하고 있었고 단지 하나의 VM 만 사용하는 것에 대해서는 레거시 애플 리케이션이 하나의 머신을 얼마나 처리 할 것인가에 대해 하드 코딩 된 제한을 가지고 있기 때문에 그렇게 할 수 없었습니다. –

답변

0

실제 IO가 관련되어 있습니까?

오래전에 저는 파일을 통해 dos 프로그램에서 Windows 프로그램으로 데이터를 보내는 아주 못생긴 연결을 구현했습니다. 이것은 초당 1 초보다 훨씬 빨랐습니다. dos 프로그램은 4k 블록을 언제든지 변경하고, 50 번 1 초 (추측 된 경우) Windows 프로그램이 프레임 번호를 읽은 다음이를 읽습니다. 프레임 번호가 다른 경우 4K 블록.

이것은 가 아니고 디스크 IO를 일으 킵니다! 거기에 앉아서 dos 프로그램이 원하는만큼 오랫동안 프레임을 여러 번 업데이트 할 수 있으며 하드 드라이브 표시등은 꺼지지 않습니다. Windows는 파일이 열려 있고 자주 쓰여지는 것을 보았습니다. 버퍼는 이 아니며 업데이트가 중지 될 때까지으로 플러시되었습니다.

링크의 Windows 쪽을 최적화하는 데 많은 시간을 할애했지만 연결이 아닌 데이터로 처리 한 것이 전부였습니다. 명백한 추악함에도 불구하고 단순히 병목 현상이 아니 었습니다.

매번 파일을 닫으면 Windows에서 다르게 처리 할 수 ​​있습니다. 램 디스크에 부착하면 디스크 IO를 수행하지 못하게됩니다.

+0

예, 단지 한 대의 기계가 IO를 먹을 수 있습니다. 그러나 동시에 15 대의 컴퓨터를 모두 동일한 HDD에서 동시에 실행하는 경우에는 약간 다릅니다. 램 디스크를 사용해야 할 것 같아요. 어떤 제안? –

+0

@nextgenneo : 당신이 놓치고있는 것은 Windows가 IO를 버퍼링했다는 것입니다. 처음에는 디스크에 들어 가지 않았습니다. –