11
votes

Fusionner une grande liste d'objets XTS

J'ai une liste de XTS d'objets qui sont mutuellement exclusives. Je souhaite Fusionner la liste dans un objet XTS . Ma tentative de faire cela était de " xxx

Cependant, cela semble manquer de mémoire. reg_1_min_prices est de 6 000 jours de retour de 1 minute sur des jours mutuellement exclusifs, donc ce n'est pas très gros. Est-ce que quelqu'un sait comment se déplacer cela?

Pour être clair: reg_1_min_prices contient des jours mutuellement exclusifs avec des prix de 1 minute tous les jours et chaque entrée de la liste est une xts objet.


6 commentaires

Est reg_1_min_prices une liste de 6 000 objets XTS, où chaque élément de liste est une donnée de 1 minute pour une seule journée?


Oui. Toutes mes excuses, laissez-moi ajouter cela à la question


Êtes-vous sûr que votre veuve cbind au lieu de rbind ? Si vous souhaitez RBind les données, Cette fonction peut aider


J'ai essayé fusionné , rbind et cbind . Tous échaissent malheureusement et gèrent l'utilisation de la mémoire d'Aourn 4 Gigs à environ 60 gigs.


La fonction que j'ai référencée ci-dessus est utilisée dans FinancialInStrument ::: getymboles.fi qui fonctionne bien pour charger et fusionner de nombreux jours de données haute fréquence.


Intéressant: j'ai fait la même chose juste dans un pour car j'ai pensé qu'il utiliserait moins de mémoire, mais il a toujours augmenté rapidement. Je vais donner votre fonction un coup. Cela pourrait être un problème plus systémique, car mes données sont assez petites?


3 Réponses :


1
votes

Voici comment faire cela efficacement: convertir chaque objet xts à un data.frame et simplement rbind . Cela ne soulève pas l'utilisation de la mémoire presque du tout. Si nécessaire, créez simplement un nouvel objet xts à partir du data.frame


3 commentaires

Je ne pense pas que do.call.rbind utilise beaucoup de mémoire non plus, et il s'agit d'une magnitude plus rapide pour les données que j'ai testées (ne comprenant même pas le temps nécessaire pour revenir à XTS ).


Ok cool, laissez-moi lui donner un coup. Vous savez-vous de savoir ce qu'il s'agit de la rbind normale qui la vis est tout-dessus?


Non, mais je parie @joshuauaulrich. Si je me rappelle correctement, Jeff dispose d'un code non engagé pour le faire beaucoup plus efficacement.



12
votes

J'utilise la stratégie fournie par Dominik dans Sa réponse à Cette question

Je l'ai transformé en un fonction dans mon package QMAO . Ce code est également au cœur de getymboles.fi dans le Forfait FinancialInStrument . xxx

si vous souhaitez rbind data.frames , @joshuauaulrich a fourni une solution élégante ici < / a>

autant que je puisse dire (sans avoir l'air de très près) la mémoire n'est pas un problème avec aucune des trois solutions proposées ( @ Joshuauaulrich's , @'s Alex's et QMAO :: do.call. rbind). Donc, cela revient à la vitesse ... xxx

do.call.rbind gagne clairement à la vitesse.


0 commentaires

10
votes

Vous ne souhaitez pas utiliser Fusionner car cela rendrait un objet de 6 000 colonnes avec une ligne pour chaque ligne de chaque élément de liste (2 880 000 dans mon exemple). Et la plupart des valeurs seront na . cbind.xts appelle simplement fusion.xts avec quelques valeurs d'argument par défaut, vous ne voulez donc pas l'utiliser non plus.

Nous sommes au courant de la mémoire Problème causé par appelant rbind.xts via do.call . Jeff a un code plus efficace, mais c'est un prototype qui n'est pas public.

Une alternative à @ Solution de GSee < / a> est d'utiliser réduire . Cela prend un certain temps à courir sur mon ordinateur portable, mais la mémoire n'est pas un problème même avec seulement 4 Go. xxx


3 commentaires

super! Qu'est-ce qui est réduit? Je n'arrive pas à trouver un réf.


@ALEX: C'est une fonction dans le paquet de base. Voir ? Réduire .


+1 pour expliquer pourquoi cbind n'était pas ce que l'OP cherchait.