Segmenter une grosse variable en bouts d'un Mo

Segmenter une grosse variable en bouts d'un Mo - PHP - Programmation

Marsh Posté le 11-10-2010 à 10:26:44    

Je souhaite scinder une grosse variable en bouts d'un méga, ce sans faire exploser la mémoire. J'avais pensé à des substr les uns à la suite des autres, ou un array_slice.
 
Mais en gros, je voudrais avoir une syntaxe s'approchant de : $ma_big_variable[0:5] un peux comme en C++, c'est possible ? :d


Message édité par Thordax le 11-10-2010 à 10:27:00

---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 11-10-2010 à 10:26:44   

Reply

Marsh Posté le 11-10-2010 à 10:51:32    

tu ne peux pas faire ça au chargement de ta grosse variable ?

Reply

Marsh Posté le 11-10-2010 à 17:40:16    

nope, ma grosse variable est le résultat d'un déchiffrement d'une donnée via une fonction encapsulée dans une DLL externe au code PHP, donc impossible ...
 
Je vais voir ce que donnent des substr mis à la chaine.


---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 12-10-2010 à 09:41:05    

tu peux la déchiffrer dans un fichier temporaire, et faire ce que dit flo après

Reply

Marsh Posté le 12-10-2010 à 11:14:06    

Le problème de cette opération, c'est que mettre la variable de 50 megs dans mon fichier temporaire me prend 10 secondes facile, donc c'est pas top optimisé côté temps !


---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 12-10-2010 à 12:59:00    

Non mais attend, réfléchis.
Tu ne veux pas mettre ton fichier en RAM car ça te bouffe trop de RAM.
Tu ne veux pas mettre ton fichier en tmp sur le HDD parce que trop lent.
 
Concrètement, tu veux qu'il soit stocké ou ton truc?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 12-10-2010 à 13:49:11    

y'a une solution, tu peux déchiffrer en stream avec mdecrypt avec le wrapper php://filter
EDIT : ou faire ton filtre custom

Message cité 1 fois
Message édité par stealth35 le 12-10-2010 à 14:25:01
Reply

Marsh Posté le 12-10-2010 à 16:20:18    

esox_ch a écrit :

Non mais attend, réfléchis.
Tu ne veux pas mettre ton fichier en RAM car ça te bouffe trop de RAM.
Tu ne veux pas mettre ton fichier en tmp sur le HDD parce que trop lent.

 

Concrètement, tu veux qu'il soit stocké ou ton truc?


Je veux bien le monter en RAM une fois, mais taper dans le fichier monté en RAM ensuite. Le problème est que je ne peux pas taper dans la data direct sans doubler cette valeur à un moment, ne serait-ce que pour piocher des segments de cette data :/ A moins que tu ne connaisses un biais !

Message cité 1 fois
Message édité par Thordax le 12-10-2010 à 16:20:28

---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 12-10-2010 à 16:21:13    

stealth35 a écrit :

y'a une solution, tu peux déchiffrer en stream avec mdecrypt avec le wrapper php://filter
EDIT : ou faire ton filtre custom


C'est une méthode de chiffrement particulière, là dessus, impossible de procéder autrement que la méthode du protocole qui lui est associée (protocole EBICS bancaire)


---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 12-10-2010 à 16:29:27    

Attend j'ai pas compris pourquoi ça devrait doubler à un moment :heink:
Tu peux expliquer plus en détails?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 12-10-2010 à 16:29:27   

Reply

Marsh Posté le 13-10-2010 à 09:43:52    

Thordax a écrit :


Je veux bien le monter en RAM une fois, mais taper dans le fichier monté en RAM ensuite. Le problème est que je ne peux pas taper dans la data direct sans doubler cette valeur à un moment, ne serait-ce que pour piocher des segments de cette data :/ A moins que tu ne connaisses un biais !


 
 
tu dois faire quoi de tes segment  
est ce que qq chose du genre :  

Code :
  1. $grosBout = "";/*2Go*/
  2.   $debut= 0 ;
  3.   $pas= 20 *1024* 1024;
  4.   do{
  5.       //si substr est efficace niveau ram ( pas testé )
  6.       $segment  = substr($grosBout, $debut, $pas);
  7.       //sinon il faut faire la parcours à la main
  8.       traiteSegment($segment);
  9.       $debut += $pas;
  10.    }while(strlen(segment));


 
au pire tu consommes sizeof(grosBout ) + sizeof(segment)

Reply

Marsh Posté le 13-10-2010 à 17:02:43    

esox_ch a écrit :

Attend j'ai pas compris pourquoi ça devrait doubler à un moment :heink:
Tu peux expliquer plus en détails?


J'ai cru que ça doublerait car je pensais que le substr allait recopier la data d'origine puis la tronquer ensuite, donc faire une explosion en mémoire, mais après tests, ce n'est pas le cas :d

flo850 a écrit :


 
 
tu dois faire quoi de tes segment  
est ce que qq chose du genre :  

Code :
  1. $grosBout = "";/*2Go*/
  2.   $debut= 0 ;
  3.   $pas= 20 *1024* 1024;
  4.   do{
  5.       //si substr est efficace niveau ram ( pas testé )
  6.       $segment  = substr($grosBout, $debut, $pas);
  7.       //sinon il faut faire la parcours à la main
  8.       traiteSegment($segment);
  9.       $debut += $pas;
  10.    }while(strlen(segment));


 
au pire tu consommes sizeof(grosBout ) + sizeof(segment)


Yep merci beaucoup pour ton bout de code, c'est nickel chrome ! :jap:


---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 13-10-2010 à 17:03:42    

j'envoi la facture a quelle banque :d ?

Reply

Marsh Posté le 13-10-2010 à 17:06:15    

Je ne donne pas ce genre d'infos [:gidoin]


---------------
Atari 520 ST 256 Ko
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed