面试题答案
一键面试优化策略
- 使用生成器(Enumerator):避免一次性将所有数据加载到内存中,而是逐块处理数据。
- 限制数据存储:只保留必要的数据,例如在计算移动平均值时,只需要保留窗口内的数据。
- 批量处理:对数据进行分块处理,减少单次处理的数据量。
- 及时释放内存:使用完的对象及时释放,避免内存泄漏。
Ruby 代码示例 - 计算移动平均值
# 使用生成器逐块读取数据并计算移动平均值
def moving_average(data_stream, window_size)
sum = 0
buffer = []
data_stream.each do |value|
buffer << value
sum += value
if buffer.size > window_size
sum -= buffer.shift
end
yield sum / buffer.size.to_f if buffer.size >= window_size
end
end
# 模拟传感器数据流,假设这是从物联网设备获取数据的生成器
sensor_data = (1..100).to_enum
# 计算窗口大小为 10 的移动平均值
moving_average(sensor_data, 10) do |average|
puts average
end
在上述代码中:
moving_average
方法接收一个数据生成器data_stream
和窗口大小window_size
。- 使用
each
方法逐块处理数据,而不是一次性加载所有数据。 buffer
数组用于存储窗口内的数据,当数组大小超过窗口大小时,移除最早的数据,并从总和中减去该数据。- 当窗口内的数据足够时,计算并通过
yield
返回移动平均值。
这样可以有效避免内存溢出问题,提高数据处理的效率。