2011-08-05 15 views
6

Quiero construir mi propia base de datos de archivos planos. Aquí es cómo puedo acceder a la base de datos de archivos planos¿Hay un límite para 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) 

¿Hay un límite impuesto por .Net para el uso de System.IO.FileShare.Read, System.IO.FileShare.Write y System.IO.FileShare.ReadWrite cuando se trata de un archivo?

quiero decir es que .Net capaz de soportar miles de usuarios que utilizan secuencia de archivo y lector corriente objetos con System.IO.FileShare.Read acceder a un mismo archivo al mismo tiempo?

+1

Hola, yo esperaría que si hay un límite es más acerca de las ventanas API subyacentes que con mucha probabilidad envolturas .NET. .. –

+1

No hay límites más allá de la memoria del conjunto de núcleos utilizada por todas estas solicitudes de E/S. Tener miles de aplicaciones leídas de un archivo en el que escribes es, bueno, valiente. No hay forma de sincronizar, estas aplicaciones leerán líneas de texto parcialmente escritas. Es por esto que los servidores existen, SQL Server es altamente preferible, un archivo de texto no es un dbase. –

+0

Hans: sincronizar el acceso a los archivos es la razón por la que se inventó el bloqueo de archivos. – Gabe

Respuesta

2

No conozco el límite exacto impuesto por .NET/windows, por lo que he creado una prueba real para usted. Ejecuté el siguiente código de prueba durante unos minutos y encontré que hasta recuentos de system.io.fileshare uso, sigue siendo funcional, es decir, todavía se puede leer el contenido del archivo de la base de datos plana.

Aquí está el código (que es una aplicación WinForm, .Net 4):

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

El miembro FileShare significa que otros archivos también pueden abrir el archivo. Esto hace no garantía de que los datos se sincronizarán de ninguna manera - simplemente significa que múltiples programas ahora pueden leer (ya que eso es lo que se propuso - FileShare.Read) a partir de ese archivo mientras lo tiene abierto.

Si utiliza ReadWrite, a continuación, varios programas pueden leer y escribir en el fichero. De nuevo, se le notificará de cualquier cambio al no a. Si varios programas están escribiendo en el mismo archivo al mismo tiempo que una transmisión, los datos se mezclarán y obtendrá un archivo dañado. (Corrompido significa que ni usted ni el otro programa podrán descompilarlo porque sus datos están entrelazados con la aplicación de sus amigos).

No existen limitaciones no razonables para el número de programas concurrentes lectura de un archivo.

4

Si intenta abrir un archivo con acceso en conflicto y compartir permisos, no funcionará. Pero si se trata de una base de datos personalizada, ¿por qué necesitaría abrir más de un identificador de archivo? Su software de base de datos personalizado debe administrar los controladores abiertos (que tienen 1 por archivo). En cuanto a su pregunta específica, no hay un límite establecido, pero las siguientes aperturas del archivo deben seguir las reglas para acceder y compartir permisos.

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

0

Debe tener sólo una FileStream para escribir en el archivo y limitar su uso a un hilo a la vez utilizando los mecanismos de cierre habituales. El modelo habitual para el software DBMS es tener una cola simultánea de operaciones de escritura y tener un hilo de escritura que las vacía. En los casos en que necesite que la fuente de la operación de escritura espere su finalización, puede usar un modelo asincrónico (BeginWrite/EndWrite).

A Semaphore puede ser precisamente lo que necesita para leer, ya que permite que un número máximo de subprocesos tenga acceso a él en cualquier momento. Puede usarlo para limitar la vibración del disco que ocurriría para un número ilimitado de lecturas aleatorias simultáneas.

Sin embargo, debe mantener siempre una caché de los datos "más calientes" en la memoria para reducir la carga. Sin él, su disco simplemente no será lo suficientemente rápido como para mantenerse al día. en la que se guardan los archivos

1

múltiples objetos pueden tener acceso a un solo archivo, sin embargo disco mantiene leen búfer de caché para cada objeto/proceso y el caché se multiplicarían con el número de objetos con el acceso a archivo. El rendimiento depende de la cantidad de bytes necesarios para mantener la memoria caché por objetos y la capacidad total de la memoria caché.

Si el archivo se modifica cuando se realiza la operación de lectura, se deben usar las lecturas asincrónicas. sin embargo, si un proceso finaliza con una parte de un archivo bloqueado o cierra un archivo que tiene bloqueos pendientes, el comportamiento no está definido.

Recomendaría destruir explícitamente los objetos de transmisión cuando no se requiera.

0

Normalmente, abrir un archivo significa que lo abre exclusivamente y ningún otro proceso puede acceder a él, a menos que le indique a Windows que desea compartirlo.

Establecer FileShare.Read/Write significa que otorga a otros procesos el derecho de leer o escribir el archivo mientras lo tiene abierto.

Restauro: otorga a otros procesos el derecho de leer y/o escribir en su archivo. Nada más y nada menos.

Imaginemos los bits de intercambio de archivos como una puerta: significa

  • Ninguno, la puerta está cerrada y bloqueada.
  • Leer significa que solo puede ir en una dirección.
  • Escribir significa, solo puede ir por el otro camino.

Entonces, ¿cuál es el límite de una puerta?

Cuestiones relacionadas