{"id":1452,"date":"2016-11-19T20:09:40","date_gmt":"2016-11-19T23:09:40","guid":{"rendered":"http:\/\/geekosas.com\/?p=1452"},"modified":"2026-05-23T17:52:31","modified_gmt":"2026-05-23T15:52:31","slug":"multy-core-performance-en-r","status":"publish","type":"post","link":"https:\/\/geekosas.com\/index.php\/es\/2016\/11\/19\/multy-core-performance-en-r\/","title":{"rendered":"Multy-Core Performance en R"},"content":{"rendered":"<h2>Introducci\u00f3n<\/h2>\n<p>Hace unos d\u00edas, caminando por ah\u00ed, vi que estaban vendiendo un HP Proliant DL360 G6 de segunda mano, para los que no saben es un servidor de alto rendimiento del a\u00f1o 2010.<\/p>\n<p>Por mi\u00a0inter\u00e9s por el el Data Science y BIG DATA, este juguete ser\u00e1 util para un diplomado en el que tengo inter\u00e9s, el cual es dictado por la FCFM de la Universidad de Chile<\/p>\n<h4>Caracter\u00edsticas del Jueguete:<\/h4>\n<ul>\n<li>2 x\u00a0Xeon 5530 2.4 ghz de 4 procesadores con hyperthreading (des habilitado en esta prueba)<\/li>\n<li>64 gb ram<\/li>\n<li>Nvidia Quadro M2000 4GB vram GDDR5<\/li>\n<li>Tarjeta Inteligente RAID con bater\u00eda.<\/li>\n<li>2 fuentes de poder independiente<\/li>\n<li>4 discos duros SAS<\/li>\n<\/ul>\n<h4>Fotos del Juguete:<\/h4>\n<h4><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1465\" data-permalink=\"https:\/\/geekosas.com\/index.php\/es\/2016\/11\/19\/multy-core-performance-en-r\/image_3140\/\" data-orig-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?fit=3504%2C2336&amp;ssl=1\" data-orig-size=\"3504,2336\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image_3140\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?fit=1024%2C683&amp;ssl=1\" class=\"alignnone size-medium wp-image-1465\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140-300x200.jpg?resize=300%2C200&#038;ssl=1\" alt=\"\" width=\"300\" height=\"200\" srcset=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?resize=300%2C200&amp;ssl=1 300w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?resize=768%2C512&amp;ssl=1 768w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?resize=1024%2C683&amp;ssl=1 1024w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?w=2000&amp;ssl=1 2000w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/image_3140.jpg?w=3000&amp;ssl=1 3000w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1464\" data-permalink=\"https:\/\/geekosas.com\/index.php\/es\/2016\/11\/19\/multy-core-performance-en-r\/hp-proliant-dl360-g6-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?fit=4992%2C1317&amp;ssl=1\" data-orig-size=\"4992,1317\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;H 25&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1232705332&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;50&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"hp-proliant-dl360-g6-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?fit=1024%2C270&amp;ssl=1\" class=\"wp-image-1464 alignnone\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1-300x79.jpg?resize=467%2C123\" alt=\"\" width=\"467\" height=\"123\" srcset=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?resize=300%2C79&amp;ssl=1 300w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?resize=768%2C203&amp;ssl=1 768w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?resize=1024%2C270&amp;ssl=1 1024w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?w=2000&amp;ssl=1 2000w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/hp-proliant-dl360-g6-1.jpg?w=3000&amp;ssl=1 3000w\" sizes=\"auto, (max-width: 467px) 100vw, 467px\" \/><\/h4>\n<p><!--more--><\/p>\n<h2>La prueba<\/h2>\n<p>Utilizar\u00e9 la librer\u00eda <strong>plyr<\/strong>, <strong>data.table, reshape2<\/strong> para realizar agregaciones y <strong>doSNOW<\/strong> para la paralelizaci\u00f3n, el dataset ser\u00e1 una tabla de unos 30 millones de registros similares a la base de datos de un operador movil (seg\u00fan recuerdo estos registros se llaman los CDR guardados en el CRCE de la plataforma de tarificaci\u00f3n).<\/p>\n<p>B\u00e1sicamente la tabla tendr\u00e1 un identificador de usuario, uno de tipo de trafico y la cantidad de trafico.<\/p>\n<h4>Generar los Datos<\/h4>\n<p>Generaremos 30 millones de registros CDR en una tabla que tendr\u00e1:<\/p>\n<ul>\n<li>identificador de usuario.<\/li>\n<li>tipo de trafico.<\/li>\n<li>cantidad de trafico.<\/li>\n<\/ul>\n<p>options(stringsAsFactors = FALSE)<br \/>\nlibrary(reshape2)<br \/>\nlibrary(plyr)<\/p>\n<h1>Parametros<\/h1>\n<p>set.seed(1986) #seteada la semilla a la fecha de nacimiento de mi querida polola.<br \/>\ntipo_trafico = c(&quot;DATA&quot;,&quot;SMS&quot;,&quot;VOICE&quot;)<br \/>\nprob_tipo_trafico = c(0.6,0.1,0.3)<br \/>\nuserids = 5e4 #simularemos n usuarios<br \/>\nregistros = 3e7 #numnero de registros CDR<\/p>\n<h1>valores aleatoreos del monto del trafico<\/h1>\n<p>datos_tipo_trafico =<br \/>\ndata.frame(<br \/>\nDATA = round(runif(registros,1,1024^2)),# sesion de datos en bytes con numero entre 1 byte y 1 mega<br \/>\nSMS = rep(1,registros), #cada sms genera un registro<br \/>\nVOICE = round(rexp(registros,1\/120)) #largo de llamadas en segundos<br \/>\n)<\/p>\n<h1>generar los registros CDR<\/h1>\n<p>cdr = data.frame(<br \/>\nid_cdr = 1:registros,<br \/>\nuserid = floor(runif(registros,1,userids+1)),<br \/>\ntipo_trafico = sample(tipo_trafico,registros,replace = T,prob = prob_tipo_trafico))<br \/>\nTI = proc.time()<br \/>\ncdr$trafico = datos_tipo_trafico$DATA<em>(cdr$tipo_trafico==&quot;DATA&quot;) + datos_tipo_trafico$SMS<\/em>(cdr$tipo_trafico==&quot;SMS&quot;) + datos_tipo_trafico$VOICE*(cdr$tipo_trafico==&quot;VOICE&quot;)<br \/>\nprint(proc.time()-TI)<br \/>\nrm(datos_tipo_trafico) #borrar tabla de daltos aleatorios<br \/>\ngc() #limpiar memoria no usada<\/p>\n<\/p>\n<p>El resultado es una tabla con este formato:<\/p>\n<table border=\"1\">\n<tbody>\n<tr>\n<th><\/th>\n<th>id_cdr<\/th>\n<th>userid<\/th>\n<th>tipo_trafico<\/th>\n<th>trafico<\/th>\n<\/tr>\n<tr>\n<td align=\"right\">1<\/td>\n<td align=\"right\">1<\/td>\n<td align=\"right\">5579<\/td>\n<td>VOICE<\/td>\n<td align=\"right\">20<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">2<\/td>\n<td align=\"right\">2<\/td>\n<td align=\"right\">28374<\/td>\n<td>VOICE<\/td>\n<td align=\"right\">82<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">3<\/td>\n<td align=\"right\">3<\/td>\n<td align=\"right\">28526<\/td>\n<td>VOICE<\/td>\n<td align=\"right\">36<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">4<\/td>\n<td align=\"right\">4<\/td>\n<td align=\"right\">39179<\/td>\n<td>VOICE<\/td>\n<td align=\"right\">56<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">5<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">14244<\/td>\n<td>DATA<\/td>\n<td align=\"right\">629075<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">6<\/td>\n<td align=\"right\">6<\/td>\n<td align=\"right\">36779<\/td>\n<td>DATA<\/td>\n<td align=\"right\">690397<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">7<\/td>\n<td align=\"right\">7<\/td>\n<td align=\"right\">42774<\/td>\n<td>DATA<\/td>\n<td align=\"right\">175632<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">8<\/td>\n<td align=\"right\">8<\/td>\n<td align=\"right\">4276<\/td>\n<td>VOICE<\/td>\n<td align=\"right\">115<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">9<\/td>\n<td align=\"right\">9<\/td>\n<td align=\"right\">4445<\/td>\n<td>VOICE<\/td>\n<td align=\"right\">44<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">10<\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\">29458<\/td>\n<td>DATA<\/td>\n<td align=\"right\">946171<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>Benchmark<\/h4>\n<p>Crearemos una tabla de trafico agregado por usuario, esta tabla ser\u00e1 generada con: <strong>reshape2, data.table y plyr<\/strong> <strong>(en un thread y multy-thread).<\/strong><\/p>\n<p>Algunos comentarios antes de mostrar los resultados:<\/p>\n<ul>\n<li>reshape2 permite realizar la agregaci\u00f3n, pero permite muchas menos opciones que las otras librer\u00edas.<\/li>\n<li>data.table es una extensi\u00f3n de data.frame que permite utilizar indices.<\/li>\n<li>plyr perimite ejecutar en un thread como en paralelo<\/li>\n<\/ul>\n<p>El c\u00f3digo utilizado:<\/p>\n<\/p>\n<h1>usando reshape2<\/h1>\n<p>TI = proc.time()<br \/>\ntmp = reshape2::dcast(cdr,userid ~ tipo_trafico, fun.aggregate = sum, value.var = &quot;trafico&quot;)<br \/>\nprint(proc.time()-TI)<\/p>\n<h1>usando plyr 1 thread<\/h1>\n<p>TI = proc.time()<br \/>\ntmp = ddply(cdr,&quot;userid&quot;,function(x) data.frame(DATA = sum(ifelse(x$tipo_trafico == &quot;DATA&quot;,x$trafico,0)),<br \/>\nSMS = sum(ifelse(x$tipo_trafico == &quot;SMS&quot;,x$trafico,0)),<br \/>\nVOICE = sum(ifelse(x$tipo_trafico == &quot;VOICE&quot;,x$trafico,0))<br \/>\n),.progress = T)<br \/>\nprint(proc.time()-TI)<\/p>\n<h1>usando plyr 8 thread (uno por CPU)<\/h1>\n<p>library(&quot;doSNOW&quot;)<br \/>\nnCPU = as.numeric(Sys.getenv(&quot;NUMBER_OF_PROCESSORS&quot;)[1])<br \/>\ncl = makeSOCKcluster(nCPU,outfile=&quot;cl.txt&quot;)<br \/>\nregisterDoSNOW(cl)<br \/>\nTI = proc.time()<br \/>\ntmp = ddply(cdr,&quot;userid&quot;,function(x) data.frame(DATA = sum(ifelse(x$tipo_trafico == &quot;DATA&quot;,x$trafico,0)),<br \/>\nSMS = sum(ifelse(x$tipo_trafico == &quot;SMS&quot;,x$trafico,0)),<br \/>\nVOICE = sum(ifelse(x$tipo_trafico == &quot;VOICE&quot;,x$trafico,0))<br \/>\n),.parallel = T)<br \/>\nprint(proc.time()-TI)<br \/>\nstopCluster(cl)<\/p>\n<p>library(&quot;doSNOW&quot;)<br \/>\nnCPU = as.numeric(Sys.getenv(&quot;NUMBER_OF_PROCESSORS&quot;)[1])<br \/>\ncl = makeSOCKcluster(2,outfile=&quot;cl.txt&quot;)<br \/>\nregisterDoSNOW(cl)<br \/>\nTI = proc.time()<br \/>\ntmp = ddply(cdr,&quot;userid&quot;,function(x) data.frame(DATA = sum(ifelse(x$tipo_trafico == &quot;DATA&quot;,x$trafico,0)),<br \/>\nSMS = sum(ifelse(x$tipo_trafico == &quot;SMS&quot;,x$trafico,0)),<br \/>\nVOICE = sum(ifelse(x$tipo_trafico == &quot;VOICE&quot;,x$trafico,0))<br \/>\n),.parallel = T)<br \/>\nprint(proc.time()-TI)<br \/>\nstopCluster(cl)<\/p>\n<h1>usando data.table<\/h1>\n<p>library(data.table)<br \/>\ncdr_dt = data.table(cdr,key = &quot;userid&quot;)<br \/>\nTI = proc.time()<br \/>\ntmp = cdr_dt[,list(DATA = sum(ifelse(tipo_trafico == &quot;DATA&quot;,trafico,0)),<br \/>\nSMS = sum(ifelse(tipo_trafico == &quot;SMS&quot;,trafico,0)),<br \/>\nVOICE = sum(ifelse(tipo_trafico == &quot;VOICE&quot;,trafico,0))<br \/>\n),by=&quot;userid&quot;]<br \/>\nprint(proc.time()-TI)<\/p>\n<\/p>\n<h2>Resultados<\/h2>\n<table width=\"271\">\n<tbody>\n<tr>\n<td width=\"79\">libreria<\/td>\n<td width=\"64\">funcion<\/td>\n<td width=\"64\">threads<\/td>\n<td width=\"64\">segundos<\/td>\n<\/tr>\n<tr>\n<td>plyr<\/td>\n<td>ddply<\/td>\n<td>1<\/td>\n<td>9,18<\/td>\n<\/tr>\n<tr>\n<td>plyr<\/td>\n<td>ddply<\/td>\n<td>2<\/td>\n<td>78,37<\/td>\n<\/tr>\n<tr>\n<td>plyr<\/td>\n<td>ddply<\/td>\n<td>8<\/td>\n<td>146,04<\/td>\n<\/tr>\n<tr>\n<td>reshape2<\/td>\n<td>dcast<\/td>\n<td>1<\/td>\n<td>17,31<\/td>\n<\/tr>\n<tr>\n<td>data.table<\/td>\n<td><\/td>\n<td>1<\/td>\n<td>12,94<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>Conclusiones<\/h4>\n<p>reshape2 a pesar de ser una librer\u00eda especializada en este tipo de transformaci\u00f3n, result\u00f3 ser m\u00e1s lenta que plyr.<\/p>\n<p>plyr se perdi\u00f3 performance a medida que se agregan threads, esto debido a que para operaciones simples, el costo de paralelizar es mayor que no utilizar el resto de las CPU.<\/p>\n<p>data.table a pesar de utilizar indices, result\u00f3 ser m\u00e1s lento que plyr, cuando se utilizan algoritmos complejos para situaciones simples, a veces se pierde performance.<\/p>\n<h4>Para el futuro&#8230;.<\/h4>\n<p>En el futuro realizar\u00e9 esas pruebas usando datasets m\u00e1s grandes y otro numero de usuarios a ver que resultados se obtienen.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Introducci\u00f3n Hace unos d\u00edas, caminando por ah\u00ed, vi que estaban vendiendo un HP Proliant DL360 G6 de segunda mano, para los que no saben es <a class=\"mh-excerpt-more\" href=\"https:\/\/geekosas.com\/index.php\/es\/2016\/11\/19\/multy-core-performance-en-r\/\" title=\"Multy-Core Performance en R\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":2137,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[13],"tags":[],"class_list":["post-1452","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized-es"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8vjqF-nq","jetpack-related-posts":[{"id":182,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/02\/arduino\/","url_meta":{"origin":1452,"position":0},"title":"Arduino","author":"Daniel Fischer","date":"2016-04-02","format":false,"excerpt":"Es dif\u00edcil comenzar este articulo, llevo unos d\u00edas jugando con mi nuevo Arduino Starter Kit y creo que la mejor forma de definirlo es: un Lego electr\u00f3nico.\u00a0Un excelente juguete\u00a0para quienes disfrutaron de los bloques a\u00f1os atr\u00e1s. Arduino es un micro controlador f\u00e1cilmente programable desde el computador utilizando Arduino IDE,\u00a0en el\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":21,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/11\/como-elegir-celular\/","url_meta":{"origin":1452,"position":1},"title":"Como elegir celular?","author":"Daniel Fischer","date":"2016-04-11","format":false,"excerpt":"Pasamos m\u00e1s tiempo con nuestro celular que con nuestra familia, es m\u00e1s, lo usamos para comunicarlos con ella y para muchos es una herramienta fundamental de trabajo. Un celular, quiera admitirlo o no, es un compa\u00f1ero de vida, que seg\u00fan sea la relaci\u00f3n te podr\u00eda acompa\u00f1ar el ba\u00f1o por varios\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/mensagens_amor_namorados_para_celular.jpg?fit=400%2C225&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3115,"url":"https:\/\/geekosas.com\/index.php\/es\/2022\/05\/07\/buenas-practicas-al-programar-con-codigo\/","url_meta":{"origin":1452,"position":2},"title":"Buenas pr\u00e1cticas al programar (con c\u00f3digo)","author":"Daniel Fischer","date":"2022-05-07","format":false,"excerpt":"Muchos disfrutan programar y resolver laberintos algor\u00edtmicos en su lenguaje favorito, pero lo que a nadie le gusta, es meterse en un c\u00f3digo viejo o incluso peor, en un c\u00f3digo escrito por otro. A m\u00ed me ha tocado hacerlo ya varias veces, algunas veces ha sido malo, otras veces peor,\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":2560,"url":"https:\/\/geekosas.com\/index.php\/es\/2018\/08\/18\/escribir-en-redshift-desde-r-a-toda-velocidad\/","url_meta":{"origin":1452,"position":3},"title":"Escribir en Redshift desde R a toda velocidad","author":"Daniel Fischer","date":"2018-08-18","format":false,"excerpt":"Como muchos saben, Redshift es un fork de Postgres hecho por Amazon para entregar un servicio de Data Warehouse, la gran diferencia entre estos 2 productos es que el primero es una base de datos columnar y comprimida, mientras que el segundo no. Las bases de datos columnares son muy\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/RtoRedshift.png?fit=600%2C300&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/RtoRedshift.png?fit=600%2C300&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/RtoRedshift.png?fit=600%2C300&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":2771,"url":"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/","url_meta":{"origin":1452,"position":4},"title":"Comparativa entre Julia, Python y R","author":"Daniel Fischer","date":"2020-04-07","format":false,"excerpt":"La discusi\u00f3n sobre que lenguaje es el mejor para analizar datos puede llevarnos a conversaciones mas apasionadas que por temas como religi\u00f3n o pol\u00edtica. Pero como Data-Scientist debemos enfocarnos en la evidencia emp\u00edrica, las dimensiones con las que se podr\u00edan comparar son muchas: Comunidad, Performance, Editores, Gestor de Paquetes, Encapsulaci\u00f3n\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/external-content.duckduckgo.com_.jpg?fit=474%2C312&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2269,"url":"https:\/\/geekosas.com\/index.php\/es\/2017\/12\/18\/estimacion-repartija-de-votos-segunda-vuelta-presidenciales-chile-2017\/","url_meta":{"origin":1452,"position":5},"title":"Estimaci\u00f3n repartija de votos segunda vuelta presidenciales Chile 2017","author":"Daniel Fischer","date":"2017-12-18","format":false,"excerpt":"Este Articulo fu\u00e9 hecho apurado y con pocos datos, el definitivo est\u00e1 en\u00a0Quien vot\u00f3 por cada Candidato? Despu\u00e9s de la primera vuelta de las elecciones presidenciales de Chile, es tradicional que cada uno de los candidatos comienza a \"rematar\" los votos de sus seguidores a aquel candidato con el que\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=700%2C400 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/1452","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/comments?post=1452"}],"version-history":[{"count":3,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/1452\/revisions"}],"predecessor-version":[{"id":3279,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/1452\/revisions\/3279"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media\/2137"}],"wp:attachment":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media?parent=1452"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/categories?post=1452"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/tags?post=1452"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}