2011-08-05 2 views
6

내 자신의 플랫 파일 데이터베이스를 만들고 싶습니다. 여기에 내가 플랫 파일 데이터베이스System.IO.FileShare에 대한 제한이 있습니까?

Dim fs As New System.IO.FileStream("C:\MyDb.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) 
Dim sr As New System.IO.StreamReader(fs) 

파일을 처리 할 때 System.IO.FileShare.Read, System.IO.FileShare.WriteSystem.IO.FileShare.ReadWrite의 사용에 대한 닷넷에 의해 부과 된 한계가 액세스하는 방법입니까? 내 말은

는 할 수 닷넷이 동시에 하나의 파일에 액세스 할 수 파일 스트림스트림 리더 System.IO.FileShare.Read 개체를 사용하여 수천 명의 사용자를 지원하는 것입니다?

+1

안녕하세요, 저는 기대. .. –

+1

이러한 모든 I/O 요청에 의해 사용 된 커널 풀 메모리 이상의 제한이 없습니다. 당신이 쓰는 파일로부터 수천 개의 앱을 읽는 것은 용감한 일입니다. 동기화 할 수있는 방법이 없습니다.이 앱은 부분적으로 작성된 텍스트 줄을 읽습니다. 이것이 서버가 존재하는 이유이며 SQL Server는 매우 선호되며 텍스트 파일은 dbase가 아닙니다. –

+0

Hans : 파일에 대한 액세스를 동기화하는 것이 파일 잠금이 발명 된 이유입니다. – Gabe

답변

2

정확한 제한을 .NET/windows에서 부과했기 때문에 실제 테스트를 만들었습니다. 다음 테스트 코드를 몇 분 동안 실행했는데 카운트가 system.io.fileshare으로 여전히 유용하다는 것을 알게되었습니다. 즉, 여전히 플랫 데이터베이스 파일의 내용을 읽을 수 있습니다. 여기

코드 (가, 닷넷 4의 WinForm 응용 프로그램입니다)입니다 : 한계가 기본이되는 윈도우 API를 대부분 .NET 랩에 대한 자세한 인이있는 경우

Public Class Form1 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Dim filepath As String = "c:\database.txt" 

     Dim filestream As System.IO.FileStream 

     Dim count As Int32 

     For count = 0 To System.Int32.MaxValue 
      filestream = New System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read) 
      AppendLog(count, filestream.ReadByte) 
     Next 
    End Sub 

    Private LogFilepath As String = "C:\LogInfo.txt" 
    Private Enter As String = Chr(13) & Chr(10) 
    Private Space As String = " " 

    Private Sub AppendLog(ByVal Sequence As Int32, ByVal info As Byte) 
     System.IO.File.AppendAllText(LogFilepath, Enter & Sequence & Space & CStr(info)) 
    End Sub 

End Class 
3

FileShare 구성원은 다른 파일에서도 파일을 열 수 있음을 의미합니다. 이것은 이 아니며은 데이터가 어떤 방식 으로든 동기화된다는 것을 보장하지 않습니다. 이는 열린 상태에서 여러 파일을 읽을 수 있다는 것을 의미합니다 (이후로는 FileShare.Read).

ReadWrite을 사용하면 여러 프로그램에서 파일을 읽고 쓸 수 있습니다. 다시 말하지만, 은 (는)에게 변경 사항이 통보되지 않습니다. 여러 프로그램이 스트림과 동시에 같은 파일에 쓰는 경우 데이터가 함께 혼합되어 파일이 손상됩니다. (데이터가 친구의 응용 프로그램과 얽혀 있기 때문에 당신이나 다른 프로그램이 디 컴파일 할 수 없음을 의미하는 부패).

파일을 읽는 동시 프로그램의 수에 부당한 제한이 없습니다.

4

액세스 권한이 충돌하여 파일을 열려고하면 공유 권한이 작동하지 않습니다. 하지만이 파일이 사용자 지정 데이터베이스 인 경우 왜 둘 이상의 파일 핸들을 열어야합니까? 사용자 지정 데이터베이스 소프트웨어는 열린 핸들 (파일 당 1 개)을 관리해야합니다. 특정 질문에 대해서는 설정된 제한이 없지만 이후에 파일을 열면 액세스 및 공유 권한에 대한 규칙을 따라야합니다.

http://msdn.microsoft.com/en-us/library/aa363874%28v=vs.85%29.aspx

0

하나만 FileStream 파일을 작성하기위한이 있어야하고, 보통 잠금 메커니즘을 사용하여 한 번에 하나 개의 스레드에 대한 사용을 제한 할 수 있습니다. DBMS 소프트웨어의 일반적인 모델은 쓰기 작업의 동시 대기열을 가져오고이를 플러시하는 쓰기 스레드를 갖는 것입니다. 완성 작업을 기다리기 위해 쓰기 작업의 소스가 필요한 경우 비동기 모델 (BeginWrite/EndWrite)을 사용할 수 있습니다.

Semaphore은 어느 시점에서나 최대 수의 스레드가 액세스 할 수 있기 때문에 읽기 위해 필요한 항목 일 수 있습니다. 동시 무작위 읽기 횟수에 제한이없는 디스크 스 래싱을 제한하는 데 사용할 수 있습니다.

그러나 부하를 줄이기 위해 항상 메모리에서 "가장 인기있는"데이터의 캐시를 유지해야합니다. 이 기능이 없으면 디스크가 충분히 빠르지 않을 것입니다.

1

여러 개체가 단일 파일에 액세스 할 수 있지만 파일이 저장된 디스크는 각 개체/프로세스에 대한 읽기 캐시 버퍼를 유지 관리하고 캐시는 파일에 액세스하는 개체의 수를 곱합니다. 성능은 개체 당 캐시 및 캐시 메모리의 총 용량을 유지 관리하는 데 필요한 바이트 수에 따라 다릅니다.

읽기 작업을 수행 할 때 파일이 수정되면 비동기 읽기가 사용되어야합니다. 그러나 프로세스가 파일의 일부가 잠긴 채 종료되거나 미해결 잠금이있는 파일을 닫는 경우 동작은 정의되지 않습니다.

필요없는 경우 스트림 개체를 명시 적으로 삭제하는 것이 좋습니다.

0

파일을 여는 것은 일반적으로 사용자가 열어 파일을 열면 공유 할 Windows에 알려주지 않는 한 다른 프로세스에서 액세스 할 수 없음을 의미합니다.

설정 FileShare.Read/Write는 다른 프로세스가 파일을 열어 읽거나 쓸 수있는 권한을 부여한다는 것을 의미합니다.

다시 말씀드립니다. 다른 프로세스에게 파일을 읽고 쓸 수있는 권한을 부여했습니다. 아무것도 더, 아무것도 덜.

는 이제 문으로 파일 공유 비트를 가정 해 봅시다 :

  • 없음을 의미합니다, 문이 닫히고 잠겨 있습니다.
  • 의미는 한 방향으로 만 이동할 수 있음을 의미합니다.
  • 쓰기는 다른 방법으로 만 갈 수 있음을 의미합니다.

그래서 제한 사항은 무엇입니까?

관련 문제