¿Cuál es un buen diseño para la extracción y conversión de grandes archivos de datos sin procesar?

Esto puede ser un problema real. AFAIK Perl básicamente hace su almacenamiento en RAM (pero incluso si pudieras encontrar algunos ajustes de memoria virtual, la paginación te golpearía). He tenido problemas similares con los errores de “falta de memoria” cuando uso conjuntos de datos bastante grandes y tengo memoria limitada.

Algunos pensamientos que pueden ayudar:

  1. Determine cuánta memoria está usando observando la asignación de memoria del sistema a su programa Perl;
  2. Relacione este uso con el tamaño de los datos. Descubra qué tan grandes pueden ser sus datos (simplemente) sin fallar, para tener una idea de la ineficiencia del almacenamiento de esos datos específicos. Esto le brinda una línea de base para mejorar.
  3. Al pasar matrices entre rutinas, asegúrese de pasar por referencia (es decir, \ @) ya que de lo contrario obtendrá grandes picos en el consumo de memoria. Puede ver esto dinámicamente utilizando la técnica que ha elegido en (1). Si tiene varias rutinas que se llaman entre sí de manera compleja mientras pasan por valor, este puede ser su problema.
  4. Si puede, lea su archivo enorme una porción a la vez en lugar de ‘sorber’ en todo el archivo diciendo, por ejemplo, @array = ; luego puede analizar esa sección, escribirla, etc. y pasar a la siguiente sección / línea / lo que sea. Rara vez tiene que leer todo el archivo de una vez.
  5. Tenga en cuenta que el manejo de la memoria de Perl es bastante inescrutable, e incluso undef generalmente no “liberará” la memoria al sistema, pero liberará la memoria para su posterior uso por parte de Perl. No he examinado los detalles de la fragmentación de la memoria en Perl, pero creo que la desfragmentación ocasionalmente puede ser un problema. Si cree que este es el caso y tiene enormes hash, puede ser conveniente borrar tanto las claves como los datos. También indefinir variables en el alcance. Etc.
  6. Asegúrese de que su problema sea el problema que cree que es. Muchas veces he rellenado mi código de alguna otra manera y culpo a la “gestión de memoria ineficiente” porque una rutina mal probada y defectuosa causa estragos

Si después de lo anterior aún tiene dificultades, es posible que desee pasar por todo el dolor de reescribir cuidadosamente su código en otro idioma como C.

Pero Perl es generalmente un buen lenguaje para el tipo de tarea que describe.

Mi 2c, Jo.

Mi pregunta sería ¿cómo está cargando el conjunto de datos? ¿Está intentando volcar todo el conjunto de datos en la memoria y luego procesarlo? Si es así, vuelva a escribir su código para acceder a los datos y procesarlos por registro (suponiendo que esté leyendo desde una base de datos). Asegúrese de liberar sus identificadores de archivo en sus consultas de registro a medida que las recorre. He procesado 50GB y más haciéndolo de esta manera y nunca tuve un problema.