IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Sharepoint .NET Discussion :

[SP2010] Vider une liste de grande taille


Sujet :

Développement Sharepoint .NET

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 352
    Points : 234
    Points
    234
    Par défaut [SP2010] Vider une liste de grande taille
    Bonjour
    J'ai une liste qu'il faudrait que je vide. J'ai fait un petit batch powershell pour cela.
    Mon souci, c'est que cette liste est énorme (+ de 30000 enregistrements), du coup, le script est très très long à s'exécuter.
    exemple : 30 billets supprimés en presque 2 heures !!!!

    J'ai pensé enregistrer ma liste comme modèle, puis la supprimer et la recréer mais :
    - d'une part je n'ai pas le lien permettant de l'enregistrer comme modèle. Pourquoi ? aucune idée ...
    - en la supprimant, je vais perdre son id donc toutes les pages qui affichent des webparts sur cette liste seront à refaire.

    auriez-vous un moyen pour vider cette liste sans la supprimer ?
    Merci pour votre aide

  2. #2
    Expert confirmé Avatar de Lapinpanda
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    3 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 230
    Points : 4 913
    Points
    4 913
    Par défaut
    Bonjour,

    exemple : 30 billets supprimés en presque 2 heures !!!!
    Votre script est mal développé, c'est impossible ce comportement.

    Il faut passer par un batch pour optimiser la suppression, c'est la bonne approche. A titre d'exemple, un batch qui supprime 2000 éléments par 2000 dans un précédent test que j'avais mis en place prend 2-3 minutes max.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 352
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par Lapinpanda Voir le message
    un batch qui supprime 2000 éléments par 2000 dans un précédent test que j'avais mis en place prend 2-3 minutes max.
    je voudrais bien voir à quoi il ressemble si c'est possible ...

  4. #4
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Voici la documentation officielle : msdn.microsoft.com

  5. #5
    Expert confirmé Avatar de Lapinpanda
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    3 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 230
    Points : 4 913
    Points
    4 913
    Par défaut
    Citation Envoyé par ludojojo Voir le message
    Voici la documentation officielle : msdn.microsoft.com
    Pas mieux

    C'est cette méthode qui doit être utiliser pour la suppression par "batch"

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 352
    Points : 234
    Points
    234
    Par défaut
    Bonjour
    Suite à vos pistes, j'ai modifié mon approche en faisant des recherches sur le net.
    J'en suis arrivé à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    	MessageLog("DEBUT")	
    	$ListName = $userfile.Config.ListeForDeletion.Value
    	$list = $web.Lists[$ListName]
     
    	$stringbuilder = new-object System.Text.StringBuilder
            $stringbuilder.Append("<?xml version=`"1.0`" encoding=`"UTF-8`"?><ows:Batch OnError=`"Return`">") > $null
    	$i=0
    	$spQuery = New-Object Microsoft.SharePoint.SPQuery
    	$spQuery.ViewFieldsOnly = $true
    	$items = $list.GetItems($spQuery);
    	$count = $items.Count
    	MessageLog("count=" + $items.Count)
    	while ($i -le ($count-1))
    	{
    	MessageLog("i=" + $i)
            $item = $items[$i]
     
            $stringbuilder.AppendFormat("<Method ID=`"{0}`">", $i) > $null
            $stringbuilder.AppendFormat("<SetList Scope=`"Request`">{0}</SetList>", $list.ID) > $null
            $stringbuilder.AppendFormat("<SetVar Name=`"ID`">{0}</SetVar>", $item.Id) > $null
            $stringbuilder.Append("<SetVar Name=`"Cmd`">Delete</SetVar>") > $null
            $stringbuilder.Append("</Method>") > $null
            $i++
    	}
    	$stringbuilder.Append("</ows:Batch>") > $null
    	$web.ProcessBatchData($stringbuilder.ToString()) > $null
     
    	MessageLog("FIN")
    ma boucle a duré une vingtaine de secondes pour 4223 documents, mais la suppression 'réelle' est beaucoup + longue, approximativement 1 document par seconde.
    Alors qu'on m'annonce 30 suppressions par seconde avec le meme code.

    étant plutot débutant dans ce domaine, pourriez-vous me dire ou c'est que j'ai merdé ???

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 352
    Points : 234
    Points
    234
    Par défaut
    bon je confirme que c'est mieux qu'avant, mais c'est pas encore extra : 4223 documents supprimés en 1h18 !
    y'a encore des progrès à faire !!!

  8. #8
    Expert confirmé Avatar de Lapinpanda
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    3 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 230
    Points : 4 913
    Points
    4 913
    Par défaut
    Bonjour,

    c'est surprenant, voici le code que j'utilise pour supprimer tous les éléments + les instances des WKF, et cela prend 1heure pour supprimer 120.000 éléments.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Function CleanSpecificList
    {
    Param ($listName)
     
    $startdate = Get-Date
    $web = Get-SPWeb $webappurl   
    $list= $web.Lists[$listName] 
     
    write-host
    write-host "Démarrage du nettoyage de la liste $($list.Title)"
     
    do
    { 
        write-host "Nombre d'éléments restant :: $($list.ItemCount)"
     
        $batch = "<?xml version=`"1.0`" encoding=`"UTF-8`"?><Batch>"
        $i = 0
     
     
        $listItems = $list.GetItems($spQuery)
        $spQuery.ListItemCollectionPosition = $listItems.ListItemCollectionPosition
     
        foreach($item in $listItems)
        {
           $i++
           #write-host "`rProcessing ID: $($item.ID) ($i of $batchSize)" -nonewline
    	   RemoveWFFromItem $item
     
    	   $batch += "<Method><SetList Scope=`"Request`">$($list.ID)</SetList><SetVar Name=`"ID`">$($item.ID)</SetVar><SetVar Name=`"Cmd`">Delete</SetVar><SetVar Name=`"owsfileref`">$($item.File.ServerRelativeUrl)</SetVar></Method>"
     
           if ($i -ge $batchSize) { break }
         }
     
          $batch += "</Batch>"
     
          write-host
          write-host "Lancement du batch de suppression de $($batchSize) éléments..."
     
          # We execute it 
          $result = $web.ProcessBatchData($batch)
     
          $list.Update
     
          # We remove items from recyclebin
          write-host
          write-host "Suppression des éléments dans la corbeille..."
     
          $web.RecycleBin.DeleteAll()
     
          #refresh de l'objet SPWeb et SPList
          $web = Get-SPWeb $webappurl   
          $list= $web.Lists[$listName] 
     
     
          $actualDate = Get-Date
          $dureeSuppression = Get-DateDiff $startdate $actualDate
          write-host "Durée de la suppression : " $dureeSuppression
    }
    while ($spQuery.ListItemCollectionPosition -ne $null)
     
    write-host
    write-host "Suppression de tous les éléments de la liste $($list.Title) terminée."
    write-host
    write-host
    }

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 352
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par Lapinpanda Voir le message
    Bonjour,

    c'est surprenant, voici le code que j'utilise pour supprimer tous les éléments + les instances des WKF, et cela prend 1heure pour supprimer 120.000 éléments.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Function CleanSpecificList
    {
    Param ($listName)
     
    $startdate = Get-Date
    $web = Get-SPWeb $webappurl   
    $list= $web.Lists[$listName] 
     
    write-host
    write-host "Démarrage du nettoyage de la liste $($list.Title)"
     
    do
    { 
        write-host "Nombre d'éléments restant :: $($list.ItemCount)"
     
        $batch = "<?xml version=`"1.0`" encoding=`"UTF-8`"?><Batch>"
        $i = 0
     
     
        $listItems = $list.GetItems($spQuery)
        $spQuery.ListItemCollectionPosition = $listItems.ListItemCollectionPosition
     
        foreach($item in $listItems)
        {
           $i++
           #write-host "`rProcessing ID: $($item.ID) ($i of $batchSize)" -nonewline
    	   RemoveWFFromItem $item
     
    	   $batch += "<Method><SetList Scope=`"Request`">$($list.ID)</SetList><SetVar Name=`"ID`">$($item.ID)</SetVar><SetVar Name=`"Cmd`">Delete</SetVar><SetVar Name=`"owsfileref`">$($item.File.ServerRelativeUrl)</SetVar></Method>"
     
           if ($i -ge $batchSize) { break }
         }
     
          $batch += "</Batch>"
     
          write-host
          write-host "Lancement du batch de suppression de $($batchSize) éléments..."
     
          # We execute it 
          $result = $web.ProcessBatchData($batch)
     
          $list.Update
     
          # We remove items from recyclebin
          write-host
          write-host "Suppression des éléments dans la corbeille..."
     
          $web.RecycleBin.DeleteAll()
     
          #refresh de l'objet SPWeb et SPList
          $web = Get-SPWeb $webappurl   
          $list= $web.Lists[$listName] 
     
     
          $actualDate = Get-Date
          $dureeSuppression = Get-DateDiff $startdate $actualDate
          write-host "Durée de la suppression : " $dureeSuppression
    }
    while ($spQuery.ListItemCollectionPosition -ne $null)
     
    write-host
    write-host "Suppression de tous les éléments de la liste $($list.Title) terminée."
    write-host
    write-host
    }
    j'ai repris ton code que j'ai testé sur une liste de test (ma liste est vide depuis le temps )
    résultat : 1000 enregistrements supprimés en 1' 20" !!
    je n'ai pas trop le temps de me pencher sur le problème, je verrai ca plus tard. en tout cas, merci beaucoup .... encore une fois !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Création d'une liste de grande taille avec date incrémentée
    Par okoama dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/05/2012, 13h43
  2. comment vider une liste de JList()
    Par Asmod_D dans le forum JDBC
    Réponses: 2
    Dernier message: 28/03/2007, 18h50
  3. Une liste deroulante de taille x envoi dans une autre liste
    Par hugo69 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/12/2006, 20h03
  4. Réponses: 2
    Dernier message: 07/12/2006, 16h14
  5. Vider une liste :)
    Par mael94420 dans le forum WinDev
    Réponses: 2
    Dernier message: 03/08/2006, 12h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo