Este breve artículo fue motivado por un problema que tuvo uno de mis clientes. Ellos utilizan Ensemble para integrar muchos sistemas, algunos solamente utilizan archivos sin formato.

De modo que ellos naturalmente seleccionaron el Adaptador para la salida de archivos para escribir en el archivo destino. Las cosas funcionaron bien durante años, hasta que hace poco, cuando el volumen de datos que se escribe en un archivo alcanzó el gran tamaño de decenas de megabytes. La operación tardó alrededor de media hora en completarse, causando problemas de sincronización ya que las operaciones subsecuentes dentro del proceso tuvieron que esperar, y el sistema de terceros no estaba feliz por tener que esperar tanto tiempo.

El código del cliente se parecía a este pseudo fragmento de código.

 <span class="hljs-keyword">set</span> tResultSet=SQLStatement.Execute()

 // compose header based <span class="hljs-keyword">on</span> resultset <span class="hljs-keyword">columns</span> <span class="hljs-keyword">Describe</span>()

 <span class="hljs-keyword">set</span> tSC= ..Adapter.PutLine(<span class="hljs-keyword">file</span>,header)

<span class="hljs-keyword">while</span> tResultSet.%<span class="hljs-keyword">Next</span>() {

 <span class="hljs-keyword">set</span> line=... compose line <span class="hljs-keyword">of</span> the resultset <span class="hljs-keyword">row</span> <span class="hljs-keyword">data</span> 

  <span class="hljs-keyword">set</span> tSC=..Adapter.PutLine(<span class="hljs-keyword">file</span>,line)

}

Después de observar el código fuente en el método del adaptador PutLine(), encontré que este método abre un archivo, escribe una línea y cierra el archivo. ¡¡¡Para cada una de las líneas!!!

Entonces, al comprobar si proporcionamos un mejor adaptador para la API, encontré el método PutStream(). ¡Bingo!, este es el correcto, ya que no abre la transmisión cada vez, solamente escribe en ella.

Reformulé el código de la siguiente forma:

set tTmpStream=<span class="hljs-function"><span class="hljs-keyword">##</span><span class="hljs-title">class</span><span class="hljs-params">(%<span class="hljs-variable">FileCharacterStream</span>)</span></span>.%New()

set tResultSet=SQLStatement.Execute()

 // compose header based on resultset columns Describe()

 set tSC= ..tTmpStream.WriteLine(header)

while tResultSet.%Next() {

 set line=... compose line of the resultset row data 

 set tSC=tTmpStream.WriteLine(line)

}

set tSC=..Adapter.PutStream(file,tTmpStream)

El cliente utilizó el código modificado y ejecutó nuevamente su operación. ¡El procesamiento de la operación ahora se realiza en segundos!

Resultado: Mientras que PutLine() puede ser su primera opción (y la más sencilla) cuando trabaja con archivos, este no necesariamente es un buen método para el entorno de producción, especialmente cuando se trata de archivos grandes.

Espero que esto le ayude con el desarrollo de sus próximos proyectos.