Je suis l'incorporation d'un grand tableau en <script>
tags dans mon code HTML, comme ceci (rien de surprenant):
<script>
var largeArray = [/* lots of stuff in here */];
</script>
Dans cet exemple particulier, le tableau a de 210 000 éléments. C'est bien en dessous du maximum théorique de 231 - par 4 ordres de grandeur. Voici la partie amusante: si je enregistrer JS source pour le tableau dans un fichier, ce fichier est >44 mégaoctets (46,573,399 octets, pour être exact).
Si vous voulez voir par vous-même, vous pouvez le télécharger à partir de GitHub. (Toutes les données qu'il est en conserve, tellement elle est répétée. Ce ne sera pas le cas dans la production.)
Maintenant, je suis vraiment pas un sujet de préoccupation de servir une quantité de données. Mon serveur de fichiers gzip ses réponses, de sorte qu'il n'a vraiment pas de prendre tout ce temps pour obtenir les données sur le fil. Cependant, il y a vraiment une fâcheuse tendance à la page, une fois chargé, de plantage du navigateur. Je ne suis pas de dépistage à tous dans IE (c'est un outil interne). Mes principaux objectifs sont de Chrome 8 et Firefox 3.6.
Dans Firefox, je peux voir un raisonnablement utile d'erreur dans la console:
Error: script stack space quota is exhausted
Dans google Chrome, j'ai simplement obtenir la triste page de l'onglet:
Couper à la chasse, déjà
- Est-ce vraiment trop de données pour notre monde moderne, "haute-performance" des navigateurs à gérer?
- Est-ce que je peux faire* pour traiter autant de données?
D'ailleurs, j'ai pu obtenir que cela fonctionne (lire: pas de plantage de l'onglet) sur-et-off dans Chrome. Je pensais vraiment que le Chrome, au moins, était fait d'un durcissement des trucs, mais apparemment je me trompais...
Edit 1
@Crayon: je ne cherchais pas à justifier pourquoi j'aimerais dump cette quantité de données dans le navigateur à la fois. Version courte: soit je résoudre ce un (certes pas-que-facile) problème, ou je dois résoudre toute une série d'autres problèmes. Je suis en optant pour l'approche la plus simple pour l'instant.
@différentes: pour l'instant, je ne suis pas particulièrement à la recherche de façons de réduire réellement le nombre d'éléments dans le tableau. Je sais que je pourrais mettre en œuvre la pagination Ajax ou quoi avez-vous, mais qui présente son propre ensemble de problèmes pour moi, à d'autres égards.
@Phrogz: chaque élément ressemble à quelque chose comme ceci:
{dateTime:new Date(1296176400000),
terminalId:'terminal999',
'General___BuildVersion':'10.05a_V110119_Beta',
'SSM___ExtId':26680,
'MD_CDMA_NETLOADER_NO_BCAST___Valid':'false',
'MD_CDMA_NETLOADER_NO_BCAST___PngAttempt':0}
@Will: mais j'ai un ordinateur avec un processeur 4 cœurs, 6 go de RAM, plus d'un demi-téraoctet d'espace disque ...et je ne suis même pas demander au navigateur de le faire rapidement - je suis juste de le demander à travailler à tous! ☹
Edit 2
Mission accomplie!
Avec le spot sur les suggestions de Juan ainsi que Guffa, j'ai pu obtenir que cela fonctionne! Il semblerait que le problème était juste dans l'analyse du code source, de ne pas vraiment travailler avec elle dans la mémoire.
Pour résumer le commentaire bourbier sur Juan réponse: j'ai dû couper mon grand tableau en une série de petits, puis Array#concat()
, mais ce n'était pas assez. J'ai également eu à les mettre en séparer var
des déclarations. Comme ceci:
var arr0 = [...];
var arr1 = [...];
var arr2 = [...];
/* ... */
var bigArray = arr0.concat(arr1, arr2, ...);
Pour tous ceux qui ont contribué à la résolution de ce: je vous remercie. Le premier tour est sur moi!
*à l'exception de l'évidence: l'envoi de moins de données dans le navigateur