2010-02-26 4 views
2

최근에 네트워크 드라이브에서 큰 파일을 읽는 데 문제가 있었으며 잘못하고있을 수 있습니다. 나는 C++ (Unmanaged)와 C# 둘 다 시도해 보았고 둘 다 똑같은 공연을했다. 다소 심했다.네트워크 드라이브에서 전체 파일 읽기 빠른 방법 (Windows, C/C++, C#, ...)

가끔 네트워크에서 파일을 4KB/s로 읽지 만,이 파일이 로컬 HD에 있으면 HD가 출력 할 수있는 최대 데이터 속도를 쉽게 얻을 수 있습니다. 그것은 한 번에 64KB 덩어리를 읽는 것입니다 ... 나는 더 큰 버퍼를 미친 숫자까지 시도 했었습니다, 또는 더 작 았고 많은 차이를 만들지 않았습니다.

비동기 I/O는 C#에서 BeginRead를 사용하고 C++에서는 OVERLAPPED IO를 사용하고 동기 읽기는 시도했지만 네트워크에서 느린 동일한 문제가있었습니다.

우리가 생각해 낸 유일한 해결책은 실제로 파일을 읽기 전에 로컬 HD에서 OS CopyFile 기능을 사용하여 파일을 복사하는 것이지만이 방법에 너무 만족하지는 않습니다. 그것은 단지 CopyFile이 우리가 접근하는 것보다 믿을 수 없을 정도로 빠르다는 것을 우리가하지 않는 것처럼 보이고 있습니다.

누구에게이 이유에 대한 단서가 있습니까?

답변

0

코드를 표시하지 않으므로 추측해야합니다. 그래서 내 생각 엔 Windows 파일 복사본이 FILE_FLAG_SEQUENTIAL_SCAN 플래그로 파일을 열면 파일 시스템/캐시가 최적의 블록 크기를 선택하고 아직 제출되지 않은 읽기 호출을 예상하여 읽기 요청을 제출하게됩니다.

+1

감사합니다,하지만 불행히도, 심지어는 Win32 CopyFile 수 기능이 무엇보다 여전히 빠른이 플래그와 나는를 CreateFile과 ReadFile을을 사용하여 올 수 ... 파일을 복사하고 CopyFile만큼 빠르지는 않습니다. (심지어 내 로컬 HD에도 아무 것도 쓰지 않고도!) 복제 할 수없는 CopyFile 내부에서 무슨 일이 일어나고 있는지 확실하지 않습니다. 로컬 HD에서 파일을 읽는 것은 항상 빠르지 만, 네트워크 드라이브가 아닌, CopyFile이 빠른 경우도 있습니다. –

0

우리는 실제로 모든 가능한 읽기/쓰기 방법을 시도해 왔다고 가정 할 수 있습니다. 동 기적 또는 비동기 적으로 읽었습니까? I/O 완료 포트를 시도 했습니까? 또는 ReadFileEx() 함수? Windows CopyFile() 함수는 네트워크에서 파일을 읽으려는 것을 감지하고 디스크 액세스를 위해 사용할 다른 방법을 사용할 것입니다.

정말로 가능한 모든 독서 방법을 다 써 버렸고 정말로 해결해야 할 것이 있다면 CopyFile() 함수가 무엇을하는지 확인해 보시기 바랍니다. 이를 수행하기위한 다양한 도구가 있습니다. 예 : this one (또는 다른 페이지는 동일한 페이지에 있습니다.) 나는 작은 벤치 마크를했고,을 열 때 내가 설정할 수있는 모든 플래그를 시도

관련 문제