2014-02-26 3 views
0

수천 개의 레코드가있는 테이블에 대해 Model.all 쿼리 (예 : Product.all)를 실행하면 레일스 콘솔이 15 초 후에 종료됩니다. 이 임계 값을 확장 할 수 있습니까 (가정) 또는 다른 방법으로 IRB를 종료하지 않고 쿼리를 실행할 수 있습니까?생산에서 15 초가 지난 후에 레일 콘솔이 종료되었습니다.

프로덕션 환경에서만이 문제가 있습니다. 내 개발 환경 (sqlite 데이터베이스) 많은 레코드로, 그것은 잘 작동합니다.

저는 Ruby 1.9.3, Ruby on Rails 3 (Unicorn과 함께)를 실행 중이며 postgres 데이터베이스를 사용하고 있습니다.

답변

2
입니다

Product.all을로드하면 프로세스가 충분한 메모리를 할당하지 못하게 모든 제품을 한 번에로드하려고 시도합니다. 한 번에 모든 제품을로드하는 것은 나쁜 습관입니다. 일괄 적으로 제품을로드하십시오. 당신은

Product.find_each do { |p| p.my_awesome_work } 

대신 당신이 강력한 컴퓨터가있을 수 있기 때문에 로컬 발생되지 Product.all.each {....}

를 사용하여 같은 일을 할 수 있으며, 컴퓨터가 아닌 일부 프로세스 메모리의 대부분을 할당 할 수있다 영웅의 사건.

+0

이것은 정확히 그랬습니다. 나는 서버가 우리가하려고하는 것에 대해 다소 힘이 부족하다고 생각한다. 어쩌면 메모리 누수가있을 수도 있습니다. ".find_each"는 매력처럼 작동합니다. – jakobkpoulsen

0

아마도 데이터베이스 mem 사용량이 과부하되었을 것입니다. 너 거기서 달리는 모이 트가 있니? monit이 사용법에 따라 프로세스를 다시 시작하는 중일 수 있습니다.

다른 터미널 화면에서 top을 사용하여 사용법을 확인하고 레일 로그를 꼬리 수 있습니다. 그것을 제외하고 당신에게로

"데이터베이스에 손실 연결"같은 것을 제공하는 경우

자극에 다음과 같이 콘솔을 실행해야합니다, 참조 :

bundle exec rails c production -s 

-s은 샌드 박스

+0

답장을 보내 주셔서 감사합니다. 그것은 RAM 부족으로 밝혀졌습니다. – jakobkpoulsen

+0

그건 내가 "당신은 아마 데이터베이스 mem 사용량을 오버로드하고있어"라고 생각했습니다. – lsaffie