2017-05-24 1 views
1

J'écris un programme qui fonctionne avec des matrices en parallèle.Type d'élément de canal trop grand Golang

Mes matrices sont créées en utilisant une constante n.

const n = 10 

Les canaux sont créés avec le code suivant:

a := make(chan [n][n]int) 

Cela fonctionne très bien pour quoi que ce soit sous une valeur d'environ 12 pour n mais rien de plus grand et l'erreur suivante est donnée:

channel element type too large (>64kB) 

En regardant des tutoriels, etc, et il semble que les canaux tamponnés peuvent être le moyen de résoudre ce problème, mais j'ai essayé de le faire avec le code suivant et la même erreur a été donnée: correctement

a := make(chan [n][n]int, 1000) 

Suis-je utiliser des canaux tamponne ou sont-ils pas la façon de résoudre ce problème? Tous les conseils sur la façon dont je peux aller de l'avant avec cela grandement apprécié.

EDIT: Suite à la réponse donnée et aux commentaires, j'essaie maintenant de créer une matrice globale qui est vide et dans laquelle les routines peuvent écrire. Je ne suis pas sûr comment il pourrait être déclaré globalement et ai essayé le dessus pour résoudre ceci. A-t-il besoin d'être initialisé globalement? Tout ce que j'ai l'air d'essayer donne des erreurs.

Répondre

1

Le canal mis en mémoire tampon ou non n'a rien à voir avec cela, l'erreur n'est pas avec l'espace pour stocker des éléments mais avec la taille d'un seul élément. La limite de taille du type d'élément du canal est un détail/une restriction d'implémentation, vous ne pouvez rien faire à ce sujet. Et si vous essayez d'utiliser un type d'élément violant ceci, cela indique que vous faites quelque chose de mal (quelque chose que vous ne devriez pas faire). Chaque fois que vous envoyez une valeur sur un canal, la valeur sera copiée. Envoyer des valeurs> 64 Ko sur un canal n'est donc pas vraiment efficace. Au lieu de cela, choisissez un type d'élément qui est petit. Le choix nécessitant le moins de changement serait d'utiliser un pointeur sur votre type: *[n][n]int.

a := make(chan *[n][n]int) 

vous avez alors bien sûr d'envoyer des pointeurs sur le canal, et vous recevrez des pointeurs de celui-ci, par exemple .:

const n = 132 
a := make(chan *[n][n]int) 

go func() { 
    var v [n][n]int 
    a <- &v // Sending a pointer 
}() 

v2 := <-a 
fmt.Println(v2) // It's a pointer 
fmt.Println(*v2) // It's an array value 

Essayez sur le Go Playground. Vous devez également garder à l'esprit que puisque nous envoyons/recevons des pointeurs sur le canal, il pointera sur la même valeur de tableau, et ainsi modifier la valeur pointée modifiera le même tableau dont nous avons envoyé l'adresse sur le canal. canal. Si cela est indésirable, une copie avant de l'envoyer, et envoyer l'adresse de la copie:

var v [n][n]int 
// Making a copy: 
v2 := v 
a <- &v2 // Sending address of the copy 

Vous devriez également envisager de travailler avec slices au lieu de arrays.

Edit:

Déclarer un tableau global est aussi facile que cela:

var result [n][n]int 

(Il doit être en dehors d'autres blocs, dans le cadre du fichier.)

+0

Salut, merci pour la réponse, cela aurait-il un sens pour moi de créer une structure appelée matrice et de l'utiliser plutôt que [n] [n] int à chaque fois? – benjano

+0

@benjano Cela ne changerait rien, la taille d'un type struct ne peut pas être inférieure à la somme de la taille de tous ses types de champs. – icza

+0

Si je voulais effectuer des calculs sur les matrices en parallèle, aurais-je besoin d'une variable globale qui contienne une matrice vierge de la même taille qui peut ensuite être sauvegardée? – benjano