Forums » Puck Software

Large datasets

Author Message
Jean-Sebastien Bournival
 Large datasets
15/12/2017 17:24  
Hi,

I am using a relatively large dataset for PUCK (more than 40,000 individuals) and, well, it's always crashing. I am planning to use larger datasets (probably more than 100,000) in a near future and I have a few questions/suggestions for you.

First, is there a way to bypass the lack of memory of the Java engine? I am interested in treating a lot of genealogies (I stopped them at the 3rd generation but it's still too heavy) and PUCK has A LOT to offer in terms of calculation power, but I can't even generate individual diagrams for some of my individuals. How can I maximize my use of PUCK under these conditions?

Also, an ODBC bridge would be a great feature. I am extracting and converting my data in MSSQL and it would be nice to export some of the results directly in my database.

For example, I am interested in listing all the relatives in my cohort by types. I have a kinship matrix that tells me who is related to whom and for each individual I want to be able to identify all the cousins, aunts, etc. Is there a way to work more on a "population" level in PUCK or is it exclusively designed for individual approaches?

Thanks for your help!

Jean-Sebastien
Isabelle Daillant
15/12/2017 23:49  
Hello,

You do not tell us on what computer you are, on what system, and with what Puck version...

There are 2 ways for boosting Puck

1. In the Puck folder, instead of opening the puck.jar
– if you are on a PC : open the puck.bat
– if you are on a Mac, AND have an older version than the current 2.3.55, try to open the puck.command (if it doesn't work, you will have to wait for the next version)

2. If you install Puck with the Puckinstaller (on the same http://www.kintip.net/ page), there are some parameters that will also boost Puck, but I let somebody who knows the Puckinstaller better than me be more precise on that).


> treating a lot of genealogies (I stopped them at the 3rd generation
You mean you tried a matrimonial census I suppose?
What did you exactly ask for when you say you stopped at the 3rd generation ?
3 3 3 ? or 3 0 0 ? or just 3 ?

The first would be to avoid anyway.
In the other cases, does 2 0 0 work ?
If so, wait until you have a boosted Puck, and try again.


I leave the ODBC / MSSQL question for somebody else to aswer.

Yes Puck can list relatives.
But the process is very much heavier than the matrimonial census you probably tried.
So try a very small one first.

In the census window : ask for OPEN instead of SPOUSE (Relation Type)
and start with a 1 0 0 pattern, checking both the "cross sex only" and the "couples only" options.
If it works, you can try unchecking one of both, then both.
Then you can try 2 0 0 with the 2 options checked again.
In any case, it will be better with a boosted Puck.


NB Don't be surprised if this post is mooved to the Puck branch of the forum. Here you are in the Kinsources branch, but the questions have nothing to do with Kinsources.

Best
Isabelle Daillant
16/12/2017 01:21  
PS
Did you already run
Menu Reports > Controls > Special Features => Launch ?

When one opens a new dataset with Puck, it is the very first thing to do.
Make sure there is no case of Cyclical descent in the reported Special features.
Jean-Sebastien Bournival
19/12/2017 03:24  
Bonjour Mme Daillant,

Merci pour cette réponse rapide et, surtout, instructive. J'ai réinstallé le logiciel sur mon PC (sous W10) et j'ai pu jouer avec les paramètres, ce qui semble avoir accéléré la vitesse d'exécution.

Pour répondre aux questions que vous soulevez je vous explique de quel fichier je pars. J'ai environ 1100 points de départ (des individus distincts pigés à même le recensement) et mon objectif est d'identifier les liens de parenté entre eux. Je me limite à l'identification des grands-parents et des cousins germains (pardon pour les termes génériques, mais je ne maîtrise pas du tout le vocabulaire généalogique).
J'ai d'abord produit une matrice d'apparentement. Le seul hic, c'est que les coefficients sont muets sur les lignées, il m'est donc impossible de savoir si le cousin est paternel ou maternel. J'ai donc produit l'ascendance sur 3 générations de tous mes points de départ (dans notre base de données MSSQL). Partant des grands-parents dans les ascendances (je repère les "sosa" correspondants), je produis la descendance de chacun d'eux sur 3 générations pour obtenir tous les cousins.
L'identification de relations de parenté précises dans notre base de données est un processus ardu. En fait, nous n'avons (à mon grand dam) aucun algorithme pour traiter ce genre de requête. D'où mon intérêt pour PUCK.

J'adopte aussi une approche peut-être plus populationnelle. Je ne cherche pas à identifier les cousins germains de Pierre Tremblay, mais bien TOUTES les relations entre mes points de départ. À partir du recensement, je veux pouvoir identifier mes réseaux de parenté et leur lignée, sans nécessairement connaître chacun des individus qui les composent (du moins pour l'instant). Après plusieurs essais, je crois que PUCK n'est pas conçu pour ce genre d'approche. Corrigez-moi si je me trompe.

Alors voilà le topo. Pour le reste, c'est un logiciel incroyable et j'aimerais pouvoir en exploiter ne serait-ce que le un cinquième. Y a-t-il un espoir pour qu'un jour il soit développé pour gérer de gros ensembles de données? Je pense notamment au projet BALSAC (où je travaille et d'où je puise les données pour mon doctorat) qui contient plus de 5 millions d'individus s'étendant sur 350 ans, ou l'initiative de Chris Dibben en Écosse qui accueillera plus de 20 millions d'actes de l'état civil...Bref, je rêve !

Merci pour les infos.

Au plaisir,

Jean-Sébastien
Pascal Cristofoli
19/12/2017 10:56  
Bonjour M. Bournival,

Comme le prévoyait I. Daillant, je me suis permis de transférer votre post au sein du Forum Puck afin que les utilisateurs profitent de vos questions et des réponses que nous proposons.

Pour continuer à travailler en termes de bases de données et sur des gros volumes sur vos questions, il faudrait surement que vous utilisiez des outils de base de données dédiés aux graphes. Par exemple Neo4j (https://neo4j.com/product/).

Cela dit, pour répondre à votre interrogation, je dirais que Puck est capable de faire ce que vous cherchez à produire: un recensement des liens de parenté dans une population donnée.
A partir de votre extraction, vous pouvez très bien faire un recensement spécifique qui va vous calculer l'ensemble des circuits de parenté entre touts les membres de votre échantillon de départ (les membres de votre recensement). Vous pouvez compter et caractériser ces circuits selon leur longueur, leur profondeur...

Comme le dit I. Daillant, le fait de choisir l'option "OPEN" signifie que, pour chaque couple d'individu de cet échantillon, PUCK va faire une recherche de parenté (sachant que les limites de cette parenté sont définie par le paramétrage que vous choisssez, I. Daillant conseille de commencer par un pattern simple, cf. plus haut). Évidemment, il s'agit d'un calcul assez long, surtout si votre population est très connectée (il faut un peu de patience).
Le résultat obtenu est consiste en plusieurs tableaux et listes:
- Statistique des circuits trouvés (combien relations pere-fils, de cousins, etc...) et le pourcentage de couples d'individus reliés.
- liste des circuits, avec les couples associés
- liste des couples avec circuits associés
- liste triable que vous pouvez exporter et réutiliser ailleurs.
Le recensement produit aussi des fichiers pajek qui permettent de visualiser le réseau de parenté

Pour plus de détails (notamment sur la notation positionnelle qui permet de lire facilement le circuits, le paramétrage et les types de résultats, vous pouvez consulter l'article suivant:
https://hal.archives-ouvertes.fr/halshs-00445418/document
Il est ancien et concerne les recensement matrimoniaux, mais le principe est le même, il n'y a que la relation de cloture qui change (OPEN à la place de SPOUSE).

En espérant que tout cela vous sera utile.
Bien cordialement,

Pascal Cristofoli
Isabelle Daillant
19/12/2017 11:04  
Bonjour,

Merci pour les nouvelles et les précisions. Et tant mieux si ça a un peu aidé.
Puck peut recenser (compter, identifier, lister...) des relations généalogiques, mais il ne peut pas en "produire".
Si je comprends bien, vous avez un corpus qui comprend les individus présents dans un recensement + leur parents et grands-parents, et les liens parents-enfants sont bien déjà codés comme tels.
Si tel est bien le cas, vous pouvez explorer les fonctionnalités du logiciel en commençant pas des requêtes légères, pour voir si le type de résultats produits correspond à ce que vous cherchez.

Au préalable, faites les contrôles du corpus
Menu Reports > Controls > Special Features > Launch avec les options par défaut
Les "Special Features" sont des points sur lesquels Puck attire l'attention, ce ne sont pas forcément des erreurs (les personnes de sexe ou de nom inconnu par ex. n'ont aucune importance)
En cas de sexe inversé des parents (male Mother et female father) : dans l'onglet Individus, aller sur la fiche d'un des enfants du couple : clic droit sur ses parents > swap parents
Ce qu'il faut vraiment corriger s'il y en a sont les cas de "cyclical descent" ; ils bloqueraient la machine.

Ensuite :
Menu Analysis > Circuit Census
Pattern : 2
Ascending relation, champ Relation type : PARENT (par défaut)
Closing relation, champ Relation type : LINEAR
Dans les cases en dessous, cocher
"Couples only" (seules les personnes mariées seront prises en compte)
"Cross sex chains only"
Ces restrictions sont juste pour faire une requête légère pour que vous puissiez voir à quoi ressemblent les résultats.
Si le recensement tourne bien, regardez dans les différents onglets produits par le recensement. C'est sans doute la "Sortable list" qui peut être la plus utile pour vous.
Dans ce cas :

Pour obtenir tous les liens de cousinage, le calcul est plus lourd,
La requête serait, dans les paramétrages du recensement :
Pattern : XX(X)XX
Ascending relation, champ Relation type : PARENT (par défaut)
Closing relation, champ Relation type : OPEN
sans les options de restriction supra (à décocher progressivement)

Sibling types : 1 ou 3 (1: tous les frères et sœurs, pleins et demis, sont juste frères et sœurs ; 3 : 2 parents communs ou même père seulement ou même mère seulement sont différenciés)

NB si vous ne voulez pas QUE les cousins mais aussi les parents, frères et sœurs, oncles et tantes, dans Pattern, entrer "2" à la place de XX(X)XX
Bien sûr, c'est plus lourd.

Attention : tout cela compte les RELATIONS sans doublons.
i.e. si Pierre et Marie sont cousins cela apparaîtra comme 1 seule relation.
Si vous voulez des résultats avec une ligne disant que Pierre est cousin de Marie,
et une autre ligne disant que Marie est cousine de Pierre,
cocher "List all perspectives" en paramétrant le recensement
les lignes seront dédoublées dans l'onglet "Sortable list" seulement.
(à ne cocher que si tout le reste marche déjà)

S'il y a des résultats utiles pour vous, nous pourrons voir plus loin.

Ce que recouvre votre demande
> À partir du recensement, je veux pouvoir identifier mes réseaux de parenté et leur lignée,
> sans nécessairement connaître chacun des individus qui les composent (du moins pour
> l'instant).
n'est pas évident pour moi...
Vous avez des quantités de composantes sans aucun lien entre elles, et vous voudriez un tagage des individus en fonction du "paquet" (en général très petit) dont ils relèvent ?

Qu'appelez-vous "lignée" ?
Si vous l'entendez au sens agnatique (patrilinéaire), vous pouvez faire une partition (le gros bouton "+" en haut à droite)
Modèle : individus
Label : PATRIC
Paramètre : laisser vide (et inutile de changer les autres boutons de la fenêtre)

Bonne exploration
Pascal Cristofoli
19/12/2017 11:14  
Re-Bonjour,

Puck-installer (télchargeable sur Kintip.net) permet de régler deux choses importantes:

- la version de java utilisée par Puck.
Puck est actuellement optimisé pour une utilisation avec Java 1.6. Puckinstaller permet l'installation de java 1.6 et créé le raccourcis qui permet de lancer Puck avec Java 1.6
- la mémoire vive allouée au fonctionnement de Puck
(il suffit d'augmenter la mémoire dédiée, sans dépasser la mémoire totale, pour booster un peu plus Puck)

Une fois l'installation terminée, il suffit alors de lancer Puck via le raccourci Puck pour que l'application se lance avec la bonne version de java (1.6) et suffisamment de mémoire vive pour traiter les gros fichiers.
Pour vérifier si ces réglages sont réellement pris en considération, il suffit d'ouvrir Puck et de vérifier les trois dernières lignes de la boite de dialogue "About Puck" (accessibles via le Menu->Help de Puck)

JVM = 1.6.0_45 20.45-b01 (--> la version de java utilisée)
XMX = 446M/625M/7132M (--> le troisième chiffre concerne la mémoire allouée)
OS = Windows 8 6.2 64bits (--> Il y a un bug d'affichage, Windows 8 est affiché même si le système de l'ordinateur est Windows 10).


PC.
Jean-Sebastien Bournival
20/12/2017 21:29  
Bonjour Isabelle et Pascal,

Merci pour ces précieuses informations, c'est très apprécié ! Je prends le temps de tout digérer et de tout tester.

Encore merci.

Jean-Sébastien.
Jean-Sebastien Bournival
20/12/2017 21:37  
Désolé pour ce double commentaire, je ne suis pas en mesure de l'effacer.
Jean-Sebastien Bournival
08/01/2018 16:24  
Bonjour Isabelle et Pascal,

J'ai suivi vos conseils et tout fonctionne. J'ai pu allouer 4GO de mémoire au logiciel et j'ai pu tester l'analyse du Circuit Census. Encore merci pour cette aide précieuse, j'ai pu gagner beaucoup de temps.

Par contre, mon fichier de départ est trop important et le processus devient trop lourd. La requête a tourné pendant plus de 36 heures pour me retourner le message d'erreur "java ran out of memory". Bien dommage. Comme je n'ai pas de superordinateur sur lequel faire tourner cette requête, je ne vois pas comment je peux m'en sortir avec cette analyse.

J'ai juste une petite question sur la sélection des individus : à la base je cherche à identifier les relations qui unissent un groupe bien défini d'individus (autour de 1000 individus distincts). En faisant l'ascendance et la descendance de chacun j'inclus tous les individus qui me permettront d'identifier ces relations. Toutefois, le calcul du Circuit Census inclut tout le monde, ce qui rend l'analyse inutilement lourde dans mon cas parce que je ne cherche qu'une poignée de liens. Est-il possible de limiter l'analyse à des individus, ou à des paires d'individus, bien définis ? Cette fonction me paraît utile en ce qu'elle permet(trait) d'identifier, pour un corpus généalogique donné, le lien qui unit 2 individus sans calculer les relations entre tous les individus.

Autrement, auriez-vous une idée de la mémoire nécessaire pour réussir à faire tourner ma requête ?

Merci encore et bon début d'année 2018 !

Jean-Sébastien
Isabelle Daillant
09/01/2018 12:51  
Bonjour,

Si vous avez pu tester l'analyse du circuit census, à quel stade d'alourdissement de la requête avec vous rencontré le blocage ?

Ceci dit, si vous vous intéressez particulièrement à 1000 personnes, cela peut simplifier les choses :
Vos 1000 personnes sont-elles déjà taguées d'une façon ou d'une autre ?
Sinon, il faudrait (plutôt directement dans le fichier source que dans Puck) créer un attribut binaire où ces 1000 personnes sont cochées (par un "x" un "oui" ou n'importe quoi d'autre)

Ensuite, dans Puck : faire une partition sur cet attribut
via le gros "+" en haut à droite :
Modèle : individus
Label : [celui que vous avez créé pour marquer vos 1000 personnes]
Paramètre : laisser vide (et inutile de changer les autres boutons de la fenêtre)

Par le menu déroulant en haut de la fenêtre Puck, vous pourrez naviguer entre les 2 paquets que cela aura créé (les 1000 et les autres ; les flèches vers le haut et le bas servent à remonter ou redescendre dans l'arborescence des paquets)
Aller sur le paquet des 1000 et demander un recensement comme indiqué dans mon message du 19/12
en cochant la case "all" dans "restriction type" ("all" signifie "all in cluster")

ça vous donnera les relations entre les personnes qui font partie du paquet (du cluster), mais en prenant aussi en compte les personnes/maillons de la chaîne qui ne sont pas dans le paquet ; i.e. seront comptées les chaînes où les deux personnes aux extrémités de la chaîne sont dans le paquet, mais pas forcément les chaînons intermédiaires.

Si je comprends bien, c'est ce que vous cherchez, et ça fait une requête beaucoup plus légère.

Bonne exploration, tenez-nous au courant
Jean-Sebastien Bournival
10/01/2018 21:56  
Bonjour,

C'est super ! C'est exactement ce que je cherchais à faire.

Merci encore !

back
© Développement : DEVINSY
© Webdesign : Aurélie Martial

ANR
Huma-Num
CNRS
EHESS
Collège de France
Université de Paris Sorbonne
Université Paris Ouest Nanterre La Défense
CSAC Kent University