Saltar al contenido

Creando un array con tamaño inicial grande en powershell

Daniel, parte de nuestro equipo de trabajo, nos ha hecho el favor de redactar esta sección ya que conoce muy bien este tema.

Solución:

Utilizar New-Object en este caso:

PS> $arr = New-Object int[] 10000; $arr.length
10000

O, en PSv5+, usando el static new() método en el tipo:

PS> $arr = [int[]]::new(10000); $arr.length
10000

Estos comandos crean un fuertemente escrito arrayusando el tipo base [int] en este ejemplo. Si el caso de uso lo permite, esto es preferible por razones de rendimiento y seguridad de tipo.

Si lo necesitas crear un “sin tipo” array de la misma manera que lo hace PowerShell ([System.Object[]]), sustituir object por int; p.ej, [object[]]::new(10000); los elementos de tal array se establecerá por defecto en $null.
La útil respuesta de TessellatingHeckler, sin embargo, muestra mucho mas conciso alternativa que incluso te permite inicializar todos los elementos a un valor específico.


Las matrices tienen un tamaño fijo; si tu necesito un array-como una estructura de datos que puede preasignar y crecer dinámicamentevea la ayuda de Bluecakes [System.Collections.ArrayList]-respuesta basada.

[System.Collections.ArrayList] es el análogo redimensionable de [System.Object[]]y es genérico equivalente – que les gusta el [int[]] ejemplo anterior – le permite utilizar una específico escribe para el rendimiento y la robustez (si es factible), es [System.Collections.Generic.List[]]p.ej:

PS> $lst = [System.Collections.Generic.List[int]]::New(10000); $lst.Capacity
10000

Tenga en cuenta que, al igual que con [System.Collections.ArrayList] – especificando un capacidad inicial (10000aquí) no asigna el uso interno array con ese tamaño inmediatamente – el valor de capacidad simplemente se almacena (y se expone como propiedad .Capacity), y un interno array con esa capacidad (tamaño interno que deja espacio para el crecimiento) se asigna a pedido, cuando se agrega el primer elemento a la lista.

[System.Collections.Generic.List[]]‘s .Add() método lo hace encomiable no producir resultados, mientras que [System.Collections.ArrayList]hace (devuelve el índice del elemento que se acaba de agregar).

PS> $al = [System.Collections.ArrayList]::new(); $al.Add('first elem')
0  # .Add() outputs the index of the newly added item
# Simplest way to suppress this output:
PS> $null = $al.Add('first elem')
# NO output.

PS> $gl = [System.Collections.Generic.List[string]]::new(); $gl.Add('first elem')
# NO output from .Add()

En PowerShell tienes razon en eso += destruirá lo viejo array y crear un nuevo array con los nuevos elementos.

Para trabajar con una gran colección de elementos, recomiendo encarecidamente utilizar el ArrayList escriba desde .NET ya que este no es un tamaño fijo array entonces PowerShell no lo destruirá cada vez que le agregue un elemento y he encontrado que esto funciona mejor en mis proyectos.

Utilizando ArrayList también significa que no necesita comenzar con 10000 elementos. Porque PowerShell no necesitará volver a crear su array cada vez, puede comenzar con 0 y luego agregar cada elemento según sea necesario en lugar de comenzar con 10000.

Así que en tu guión crearía un vacío ArrayList al igual que

[System.Collections.ArrayList]$arr = @()

y luego, cuando necesite agregarle algo, simplemente llame .Add() (No es necesario rellenar previamente el array con 10000 elementos, se expandirá a medida que agregue elementos).

$arr.Add([int]0)

Su ejemplo usando un ArrayList:

[System.Collections.ArrayList]$arr = @()
for ($i = 1; $i -le 10000; $i++) 
    $arr.Add([int]0)

Multiplicación literal de matrices:

$arr = @($null) * 10000

Aquí puedes ver las comentarios y valoraciones de los usuarios

Al final de la post puedes encontrar los comentarios de otros programadores, tú igualmente puedes mostrar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *