2011-02-27 20 views
7

¿Cuál es la mejor manera de cargar datos enormes de archivos de texto en Delphi? ¿Hay algún componente que pueda cargar archivos de texto súper rápido?¿Está utilizando TStringList para cargar archivos de texto enormes de la mejor manera en Delphi?

Digamos que tengo un archivo de texto que contiene la base de datos y se almacena en formato de longitud de corrección. Contiene 150 campos con cada uno al menos 50 caracteres. 1. Es necesario cargar en la memoria 2. Necesito analizarlo y, probablemente, almacenarlo en un memdataset para procesar

Mis preguntas: 1. ¿Es suficiente si utilizo el método TStringList.loadFromFile? 2. ¿Hay algún otro componente mejor para manipular el archivo de texto? 3. ¿Debo usar lectura de bajo nivel del archivo de texto?

Gracias de antemano.

+0

TStrings.LoadFromFile utiliza memoria 2 * N, tiene que usar el cargador de bajo nivel para archivos grandes –

Respuesta

11

TStringList nunca es la forma óptima de trabajar con mucho texto, pero es la más simple. Si tiene pequeños archivos en sus manos, puede usar TStringList sin problemas. Incluso si tiene archivos grandes (no archivos de gran tamaño), puede implementar una versión de su algoritmo utilizando TStringList para fines de prueba, porque es simple y fácil de entender.

Si sus archivos son grandes, como probablemente lo sean ya que los llama "bases de datos", necesita buscar tecnologías alternativas que le permitirán leer solo todo lo que necesite de la base de datos. Mira en:

  • TFileStream
  • memoria archivos asignados.

No mires las viejas API basadas en "archivos" todavía disponibles en Delphi, son completamente antiguas.

No voy a entrar en detalles sobre cómo acceder a texto utilizando estos métodos, ya que hemos tenido recientemente dos preguntas similares sobre SO:

How Can I Efficiently Read The FIrst Few Lines of Many Files in Delphi

y

Fast Search to see if a String Exists in Large Files with Delphi

1

Recomiendo adherirse al TStringList si lo encuentra conveniente para su problema. La optimización es otra cosa que debería hacerse más tarde.

En cuanto a TStringList la optimización es declarar una clase descendiente que anula el método TStrings.LoadFromStream - puede hacerlo prácticamente lo más rápido posible, teniendo en cuenta la estructura de sus archivos.

2

Dado que tiene una longitud fija con la que está trabajando, puede crear una clase de acceso basada en TList con un TWriter y un TReader que tomarán en cuenta sus registros. No tendrá ninguno de los gastos generales de una TStringList (no es que sea algo malo, pero si no lo necesita, porque lo tiene) y puede incorporar su propio acceso a los registros en la clase. En última instancia, depende de lo que intente lograr con los datos una vez que lo haya cargado en la memoria. Si bien TStringlist es fácil de usar, no es tan eficiente como "rodar la tuya".

Sin embargo, la eficacia en la manipulación de datos puede no ser tan problemática, ya que está utilizando archivos de texto para contener una base de datos. Si solo necesita leer y tomar decisiones basadas en los datos del archivo, TList más flexible puede ser excesivo.

+0

Dudo que la longitud del texto en cada línea sea fija; El OP dice 'contiene 150 campos con cada uno al menos 50 caracteres'. Creo que la cantidad de corrección es la cantidad de campos. –

1

No queda del todo claro por qué necesita cargar todo el archivo en la memoria, antes de continuar creando un conjunto de datos en memoria ... ¿está combinando los dos problemas? (es decir, porque necesita crear un conjunto de datos en memoria, ¿cree que primero necesita cargar completamente los datos de origen en la memoria? ¿O hay algún preproceso inicial del archivo fuente que solo es posible con el archivo completo cargado en la memoria? (Esto es poco probable e incluso si este es el caso, no es necesario con un objeto de transmisión navegable como un TFileStream).

Pero creo que la respuesta que está buscando está ahí en la pregunta ... Si está cargando este archivo para analizarlo y completar/inicializar otra estructura de datos (el conjunto de tiempo) paso

Utilice los medios de acceso de nivel más bajo que proporcionan las capacidades que necesita.

En este caso, un TFileStream proporcionará el mejor equilibrio entre la comodidad y la facilidad de uso.

+0

Necesito comparar de a archivos. Tengo dos archivos de entrada, uno como base de datos maestra y otro es un archivo para comparar. Necesito enumerar todos los campos en la base de datos maestra que coinciden con ciertos valores en el archivo para comparar. – WishKnew

+0

Esto explica lo que está haciendo, pero aún no explica por qué tiene que hacerlo de la manera que parece haber decidido. Todavía no tengo claro que no puedas usar una transmisión para hacer lo que has descrito. Si el rendimiento es una preocupación, entonces implementaría primero el uso de un TFileStream, si el rendimiento se convierte en un problema que podrías convertir a TMemoryStream casi al instante. Si es necesario * entonces * puede ver estructuras más sofisticadas basadas en donde realmente provienen sus problemas específicos de desempeño. – Deltics

Cuestiones relacionadas