2010-02-02 22 views
7

Me parece que una forma de almacenar datos en un árbol B como un archivo se puede hacer eficientemente con C usando un archivo binario con una secuencia (matriz) de estructuras, con cada estructura representando un nodo. Por lo tanto, uno puede conectar los nodos individuales con un enfoque que será similar a crear listas vinculadas utilizando matrices. Pero entonces el problema que apuntalaría sería la eliminación de un nodo, ya que borrar solo unos pocos bytes en el medio en un archivo enorme no es posible.C/C++: Cómo almacenar datos en un archivo en el árbol B

Una forma de eliminar podría ser realizar un seguimiento de los nodos 'vacíos' hasta que se alcance un límite de corte y luego crear otro archivo que descarte los nodos vacíos. Pero esto es tedioso

¿Existe un mejor enfoque desde el punto de vista de simplicidad/eficiencia para eliminar, o incluso representar un árbol B en un archivo?

TIA, -Sviiya

+0

Para que quede claro, ¿estás preguntando sobre árboles B o árboles binarios? –

+0

B-trees. Pero supongo que con el fin de almacenar como archivos, ¿el problema sería el mismo? – user203405

+0

BTW, C y C++ son dos idiomas diferentes. Si está escribiendo código que funciona en ambos, agregue la etiqueta C++. –

Respuesta

2

Hice una búsqueda muy rápida y Desenterré esto: http://people.csail.mit.edu/jaffer/WB fuente en C: http://cvs.savannah.gnu.org/viewvc/wb/wb/c/ - parece ofrecer bases de datos tipo árbol B basados ​​en disco - a pesar de echar un vistazo a "eliminar .c "parecía implicar que si eliminas un nodo, todo lo que está abajo se eliminaría; si ese es el comportamiento correcto, entonces parece que podría ser útil".

Además, los B-trees se utilizan a menudo en sistemas de archivos. ¿No podría echar un vistazo a algún código del sistema de archivos?

Mi propia inclinación es la de un sistema de archivos: si tiene un B-tree de tamaño fijo, cada vez que "elimina" un nodo en lugar de intentar eliminar la referencia, simplemente establezca el valor en lo que signifique nada en tu código Luego, ejecute un hilo de limpieza que verifique si alguien tiene el archivo abierto para leer y si todo está silencioso bloquea el archivo y se ordena.

+0

Gracias por la referencia, Ninefingers. :) Sin duda tendré que leerlo. Dado que la eliminación puede ser frecuente, su contabilización debería ser eficiente. Esperaría que algunas de estas operaciones pudieran retrasarse, pero necesitaría leer el código para ver si hay una mejor opción. También tengo la intención de usarlo para un sistema de archivos más tarde, pero entonces la aplicación sería diferente ya que el tamaño sería constante. Entonces el diseño tendrá que tener eso en cuenta. – user203405

+0

Hmm Estoy de acuerdo. Ese código pretende hacer lo que necesita y una mirada rápida a viewcvs sugiere que podría hacerlo, sin sentarse y reconstruir su problema aunque es difícil de decir ... Creo que los sistemas de archivos simplemente hacen "cero" elementos que desean eliminar y asignar a cualquier elemento cero, pero podría tener eso mal. De cualquier manera, si esto no responde, por favor abre la pregunta nuevamente. –

+0

Las preguntas no responden a lo que estaba buscando, y ya me enteré del archivo truncado y, por lo tanto, se elude el problema de eliminar datos del medio. Gracias. :) – user203405

1

También puede usar Berkley DB. Funciona bien con programas C e implementa árbol B +.

+0

Sí, pero quiero escribir mi propio código para obtener la sensación real. :) – user203405

+0

De acuerdo. Escribir por su cuenta está bien para obtener la sensación real. BBD es una base de datos muy sofisticada y proporciona muchas características que el código normal no tendría. En el caso de la implementación real del producto, elegiría BDB. Reinventar la rueda sería difícil aquí. – Jack

4

Para implementar B-Trees en un archivo, puede utilizar el desplazamiento de archivo en lugar de punteros. Además, puede implementar un "administrador de memoria de archivos" para que pueda volver a utilizar los elementos eliminados en el archivo.

Para recuperar completamente los bloques eliminados en un archivo B-Tree, tendrá que volver a crear el B-Tree en un nuevo archivo. Recuerde también que la mayoría de los sistemas operativos no tienen métodos para truncar archivos. Un método portátil para truncar un archivo es escribir un nuevo archivo y destruir el anterior.

Otra sugerencia es dividir el archivo en partición B-Tree y partición de datos (elemento). Una partición B-Tree contendrá las páginas. Las páginas de hoja contendrán desplazamientos a los elementos de datos. La partición de datos será una sección en el archivo que contiene elementos de datos. Puede terminar creando más de una de cada partición y las particiones pueden estar intercaladas.

Pasé mucho tiempo jugando con un B-Tree basado en archivos, hasta que me di por vencido y decidí dejar que un programa de base de datos (o servidor) manejara los datos por mí.

+0

Suena interesante. Este ejercicio mío es para obtener cierta exposición a la codificación de bajo nivel. Me interesan principalmente los sistemas basados ​​en Linux y admite el truncamiento de archivos. :) – user203405

+0

La mayoría de los SO * do * tienen funciones para truncar archivos. En Linux, BSD, Windows puede establecer la longitud del archivo a su gusto. –

Cuestiones relacionadas