J'ai un ensemble de données croissant de 4 millions de lignes environ, afin de définir et d'exclure les valeurs aberrantes (pour l'utilisation de statistiques/analytiques) J'ai besoin que l'algorithme considère toutes les entrées dans cet ensemble de données. Cependant, c'est trop de données à charger dans la mémoire et mon système étouffe. J'utilise actuellement ce pour recueillir et traiter les données:Les données sont trop volumineuses pour être chargées en mémoire
@scoreInnerFences = innerFence Post.where(:source => 1).
order(:score).
pluck(:score)
En utilisant la fracture typique et la conquête de méthode ne fonctionnera pas, je ne pense pas parce que chaque entrée doit être considéré comme garder mon calcul précis des valeurs aberrantes . Comment cela peut-il être réalisé efficacement?
innerFence
identifie le quartile inférieur et le quartile supérieur de l'ensemble de données, puis utilise ces résultats pour calculer les valeurs aberrantes. Voici (encore refondus, non-DRY) code pour ceci:
def q1(s)
q = s.length/4
if s.length % 2 == 0
return (s[ q ] + s[ q - 1 ])/2
else
return s[ q ]
end
end
def q2(s)
q = s.length/4
if s.length % 2 == 0
return (s[ q * 3 ] + s[ (q * 3) - 1 ])/2
else
return s[ q * 3 ]
end
end
def innerFence(s)
q1 = q1(s)
q2 = q2(s)
iq = (q2 - q1) * 3
if1 = q1 - iq
if2 = q2 + iq
return [if1, if2]
end
Que fait 'innerFence'? La réponse évidente est de faire ce que vous faites dans 'innerFence' dans la base de données plutôt que dans Ruby - mais cela dépend de l'implémentation de' innerFence'. –
Il identifie les quartiles inférieur et supérieur de mon ensemble de données, puis calcule les valeurs aberrantes. J'ai ajouté la source dans ma dernière édition. –