Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 内存泄漏导轨&x2B;Sidekiq+;赫罗库+;jsonb_Ruby On Rails_Json_Heroku_Memory Leaks_Sidekiq - Fatal编程技术网

Ruby on rails 内存泄漏导轨&x2B;Sidekiq+;赫罗库+;jsonb

Ruby on rails 内存泄漏导轨&x2B;Sidekiq+;赫罗库+;jsonb,ruby-on-rails,json,heroku,memory-leaks,sidekiq,Ruby On Rails,Json,Heroku,Memory Leaks,Sidekiq,在过去的两年里,我获取了大量的某一货币对的加密小时价格。我已经使用Sidekiq来同时处理多个硬币 问题是,当我使用jsonb存储信息时,我怀疑它导致了大内存泄漏。但我可能错了,我的活动记录查询没有得到优化 其结果是,我的Heroku员工不断超过配额并关闭 def get_2_years_of_btc_data(coin_id) begin time_batches = [1451606400,1458810000,1466013600,147321720

在过去的两年里,我获取了大量的某一货币对的加密小时价格。我已经使用Sidekiq来同时处理多个硬币

问题是,当我使用jsonb存储信息时,我怀疑它导致了大内存泄漏。但我可能错了,我的活动记录查询没有得到优化

其结果是,我的Heroku员工不断超过配额并关闭

def get_2_years_of_btc_data(coin_id)
        begin
            time_batches = [1451606400,1458810000,1466013600,1473217200,1480420800,1487624400,1494828000,1502031600,1509235200,1516438800,1523642400]
            time_batches.each do |time| 
                 sync_hourly_btc_data(coin_id,time)                 
            end
        rescue => e
            #ScrapeLog.create(error: e.message, process: "Cryptocompare - Sync Coin Prices", resource: "coin", resource_id: coin_id)
        end
    end

def sync_hourly_btc_data(coin_id,floored_timestamp)
    coin = Coin.find(coin_id)
    snap = coin.snap        
    response = HTTParty.get("https://min-api.cryptocompare.com/data/histohour?fsym=#{coin.ticker}&aggregate=1&tsym=BTC&limit=2000&toTs=#{floored_timestamp}")
    json = JSON.parse(response.body)
    data = json["Data"]
    if snap.btc_counter_cache < 1
        snap.to_btc = data
    else
        new_data = data.select {|data| data["time"] > snap.btc_to_ts} 
        snap.to_btc = snap.to_btc + new_data
    end
    snap.btc_from_ts = snap.to_btc.first["time"]
    snap.btc_to_ts = snap.to_btc.last["time"]
    snap.coin.real_price_btc = snap.to_btc.last["close"]
    snap.btc_counter_cache = snap.to_btc.size
    snap.save
end
def获取2年的btc数据(硬币id)
开始
时间-批次=[145160640014588810000146013600147321720014804280148762440014948800015020316000150923520015164388001523642400]
时间。每个人都做时间
同步每小时btc数据(硬币id、时间)
结束
救援=>e
#create(错误:e.message,进程:“加密比较-同步硬币价格”,资源:“硬币”,资源id:硬币id)
结束
结束
def同步每小时btc数据(硬币id、落地时间戳)
coin=coin.find(coin\u id)
snap=coin.snap
response=HTTParty.get(“https://min-api.cryptocompare.com/data/histohour?fsym=#{coin.ticker}&aggregate=1&tsym=BTC&limit=2000&toTs=#{floored_timestamp}”)
json=json.parse(response.body)
data=json[“data”]
如果snap.btc_计数器_缓存<1
snap.to_btc=数据
其他的
new|u data=data.select{| data | data[“time”]>snap.btc|u to|ts}
snap.to_btc=snap.to_btc+新数据
结束
snap.btc_from_ts=snap.to_btc.first[“time”]
snap.btc_to_ts=snap.to_btc.last[“time”]
snap.coin.real_price_btc=snap.to_btc.last[“close”]
snap.btc_计数器_缓存=snap.to_btc.size
快照。保存
结束
Snaps是存储每枚硬币价格信息的表格,to_btc是存储所有数据的jsonb列

我需要帮助,知道这是一个常见的jsonb问题,当它变得越来越大或者我的活动记录查询效率低下时


谢谢大家!

这里的问题似乎不是jsonb。我假设提供的代码是实际的工作者,因此我在这里的第一步是在每个时间批中让工作者排队。您当前执行此操作的方式似乎必须将所有API响应保存在内存中

因此,如果您在每个时间批中排队等待作业/工作人员,您可以单独处理每个响应-如果工作人员之间有一些退避(排队以2分钟或其他时间间隔运行),您应该可以


我想数据是如此之大,您正在进行的选择遍历也是相当昂贵的

Hey T。您是否测量过响应返回所需的时间,以及返回的数据实际有多大?还有,这是BG的工作吗?此批处理大小为11个不同的请求,Heroku警告说,所有耗时超过500毫秒的请求都应该在BG作业中。