# R/01-memory-architecture.R#' Understand R memory model#'#' @return Memory model informationunderstand_memory_model<-function(){memory_info<-list(memory_limit=memory.limit(),memory_usage=memory.size(),gc_info=gc(),object_sizes=get_object_sizes(),memory_allocations=get_memory_allocations())return(memory_info)}#' Get object sizes in workspace#'#' @return Object sizesget_object_sizes<-function(){library(pryr)objects<-ls(envir=.GlobalEnv)sizes<-sapply(objects,function(x){tryCatch({object_size(get(x))},error=function(e){NA})})# Remove NA valuessizes<-sizes[!is.na(sizes)]# Sort by sizesizes<-sort(sizes,decreasing=TRUE)return(sizes)}#' Get memory allocations#'#' @return Memory allocation informationget_memory_allocations<-function(){library(pryr)allocations<-list(total_memory=mem_used(),gc_memory=gc(),memory_objects=object_sizes())return(allocations)}#' Monitor memory usage over time#'#' @param duration Monitoring duration in seconds#' @param interval Monitoring interval in seconds#' @return Memory usage over timemonitor_memory_usage<-function(duration=60,interval=1){memory_data<-data.frame(timestamp=numeric(0),memory_used=numeric(0),gc_count=numeric(0),object_count=numeric(0))start_time<-Sys.time()while(as.numeric(Sys.time()-start_time)<duration){current_time<-Sys.time()memory_used<-mem_used()gc_info<-gc()object_count<-length(ls(envir=.GlobalEnv))memory_data<-rbind(memory_data,data.frame(timestamp=as.numeric(current_time),memory_used=memory_used,gc_count=sum(gc_info[,1]),object_count=object_count))Sys.sleep(interval)}return(memory_data)}
# R/02-efficient-data-types.R#' Choose memory-efficient data types#'#' @param data Data to optimize#' @return Memory-optimized datachoose_memory_efficient_types<-function(data){optimized_data<-datafor(colinnames(data)){if(is.numeric(data[[col]])){optimized_data[[col]]<-optimize_numeric_column(data[[col]])}elseif(is.character(data[[col]])){optimized_data[[col]]<-optimize_character_column(data[[col]])}elseif(is.logical(data[[col]])){optimized_data[[col]]<-optimize_logical_column(data[[col]])}}return(optimized_data)}#' Optimize numeric column#'#' @param column Numeric column#' @return Optimized numeric columnoptimize_numeric_column<-function(column){# Check if all values are integersif(all(column==as.integer(column),na.rm=TRUE)){# Use integer if possibleif(all(column>=-2147483648&column<=2147483647,na.rm=TRUE)){return(as.integer(column))}else{# Use long integerreturn(as.numeric(column))}}else{# Check if single precision is sufficientif(all(abs(column)<3.4e38,na.rm=TRUE)){return(as.single(column))}else{return(as.double(column))}}}#' Optimize character column#'#' @param column Character column#' @return Optimized character columnoptimize_character_column<-function(column){# Check if factor would be more memory efficientunique_values<-length(unique(column))total_values<-length(column)if(unique_values<total_values*0.5){return(as.factor(column))}else{return(column)}}#' Optimize logical column#'#' @param column Logical column#' @return Optimized logical columnoptimize_logical_column<-function(column){# Logical columns are already memory efficientreturn(column)}#' Compare memory usage of data types#'#' @param data Data to compare#' @return Memory usage comparisoncompare_memory_usage<-function(data){library(pryr)# Original dataoriginal_memory<-object_size(data)# Optimized dataoptimized_data<-choose_memory_efficient_types(data)optimized_memory<-object_size(optimized_data)# Calculate savingsmemory_savings<-original_memory-optimized_memorysavings_percentage<-(memory_savings/original_memory)*100return(list(original_memory=original_memory,optimized_memory=optimized_memory,memory_savings=memory_savings,savings_percentage=savings_percentage))}
# R/02-efficient-data-types.R (continued)#' Convert to sparse data structures#'#' @param data Data to convert#' @param sparsity_threshold Sparsity threshold#' @return Sparse data structureconvert_to_sparse<-function(data,sparsity_threshold=0.5){library(Matrix)# Check sparsitysparsity<-calculate_sparsity(data)if(sparsity>sparsity_threshold){# Convert to sparse matrixsparse_data<-as(data,"sparseMatrix")return(sparse_data)}else{return(data)}}#' Calculate sparsity of data#'#' @param data Data to analyze#' @return Sparsity percentagecalculate_sparsity<-function(data){if(is.matrix(data)){zero_count<-sum(data==0)total_count<-length(data)sparsity<-zero_count/total_count}else{# For data frames, calculate sparsity for numeric columnsnumeric_cols<-sapply(data,is.numeric)if(sum(numeric_cols)==0){return(0)}numeric_data<-data[,numeric_cols,drop=FALSE]zero_count<-sum(numeric_data==0)total_count<-length(numeric_data)sparsity<-zero_count/total_count}return(sparsity)}#' Optimize sparse data operations#'#' @param sparse_data Sparse data#' @param operation Operation to perform#' @return Optimized operation resultoptimize_sparse_operations<-function(sparse_data,operation){# Use sparse matrix operationsif(operation=="matrix_multiply"){return(sparse_data%*%sparse_data)}elseif(operation=="matrix_add"){return(sparse_data+sparse_data)}elseif(operation=="matrix_transpose"){return(t(sparse_data))}}
# Complete memory management pipelinemanage_memory<-function(data,memory_config){# Monitor current memorymemory_info<-understand_memory_model()# Optimize data typesoptimized_data<-choose_memory_efficient_types(data)# Control garbage collectiongc_control<-control_garbage_collection(memory_config$gc_type,memory_config$gc_params)# Implement lazy loading if neededif(memory_config$lazy_loading){data<-implement_lazy_loading(optimized_data,memory_config$loading_strategy)}# Clean up memorycleanup_results<-cleanup_memory(memory_config$cleanup_type,memory_config$cleanup_params)return(list(data=data,memory_info=memory_info,gc_control=gc_control,cleanup_results=cleanup_results))}