2012-05-26 4 views
-4

일부 레코드 목록을 HTML로 보내는 동안 페이지가 1500 레코드로 매우 느립니다. 수사 결과 나는 단지 1500 건의 레코드에 대해 엄청난 양의 데이터가 전달된다는 것을 알았습니다. 3에서 4MB 사이였습니다. 각 행에는 약 6 개의 값이 있으며, 모두 문자열이며 그 중 두 개는 날짜 시간 객체입니다.1500 레코드에 대한 목록 목록에 3MB 이상의 데이터가 있습니다.

나는 주위를 둘러 보았고 사전이 무겁고 데이터 튜플을 바꾸는 사전이 다른 페이지의 부하를 줄였다는 것을 알았습니다. 그러나 첫 번째 페이지에는 모두 1,000 개의 레코드 목록 만 전송되므로 목록의 목록입니다.

방화범을 통해 모든 레코드에 대해 얼마나 많은 데이터가 전송되는지 살펴 보았습니다. 레코드 당 1kb 이상의 데이터를 발견했습니다.

내 응용 프로그램이 모든 데이터가 이미 압축되고있는 웹 응용 프로그램이므로 이것은 성능 문제입니다.

아무도 나에게 도움이 될 수 있습니까?, 파이썬리스트와 객체가 정말 무겁습니까?

더 자세히 조사 할 방법이 있는지 알려주십시오.

+5

그리고 코드를 보지 않고 문제를 파악해야합니다 ... 어떻게해야합니까? 우리에게 호의를 베풀고 몇 가지 예를 게시하십시오. 바로 지금은 차고로 걸어가 자동차 정비사에게 불만을 제기하는 것과 같습니다. 차가 느리다고 즉각 고쳐야합니다. –

+0

:) 나는이 문제에 대해 목록에 kb 이상이 있다고 말하고 있는데, 이는 흔한 일입니까?나는 코드에 문제가 있다고 생각하지 않는다. –

+0

당신은 단지 문자열과 날짜 객체를 말합니다. 문자열의 길이는 얼마입니까? 문자열은 단일 문자이거나 테라 바이트 일 수 있습니다. –

답변

1

이 많은 메모리를 사용하는 방법을 보여줍니다 :

import sys 

a = ["abcdef", "ghijklmnop"] 
sys.getsizeof(a) # => 44 (size of list a in bytes) 

당신이 파이썬에서 페이지를 렌더링에 대해 얘기하고있다 "HTML로 목록을 보내", 또는 JSON으로 보내는 이야기 ? 필요한 최소한의 데이터 만 보내고 있습니까 아니면 "모든 것"을 보내고 필터링하고 있습니까?

.

편집 : 좋은 지적.

import sys 
import datetime 

def show_mem(data, indent=" ", depth=0): 
    "Recursively show the memory usage of a data structure" 
    mysize = sys.getsizeof(data) 
    if isinstance(data, (list,tuple,dict)): 
     childsize = 0 
     print("{}{} bytes: [".format(indent*depth, mysize)) 
     for d in data: 
      childsize += show_mem(d, indent, depth+1) 
     print("{}] (total: {} bytes)".format(indent*depth, mysize+childsize)) 
     return mysize+childsize 
    else: 
     print("{}{} bytes: {}".format(indent*depth, mysize, repr(data))) 
     return mysize 

show_mem([1223456, 1245361536363, 'infooooooooo123', datetime.date(1975,7,21), "http://www.somesite.org/the/path/page.htm"]) 

56 bytes: [ 
    12 bytes: 1223456 
    18 bytes: 1245361536363L 
    36 bytes: 'infooooooooo123' 
    20 bytes: datetime.date(1975, 7, 21) 
    62 bytes: 'http://www.somesite.org/the/path/page.htm' 
] (total: 204 bytes) 

를 반환하는 방법 : 다음에 대해.

편집 # 2 : diff (한 레코드로 렌더링 된 페이지)와 (두 레코드로 렌더링 된 페이지) diff를 실행해야합니다. 이렇게하면 하나의 레코드를 추가 할 때 페이지 결과가 정확하게 표시됩니다. HTML에 숨겨진 속성이나 크기가 부풀어 오르는 인라인 자바 스크립트가 많이있을 수 있습니다. 리눅스 명령 줄에서 즉

:

diff -b saved_one_record.html saved_two_records.html 

이 장고 템플릿에서 최종 렌더링 당 행 HTML로

61a66 
><tr class="rowA"> 
    <td class="_1"><a href="#row=1223456" alt="Show details">1223456</a></td> 
    <td class="_2"><span style="">1245361536363</span></td> 
    <td class="_3"><a href="http://www.somesite.org/the/path/page.htm"><b>infooooooooo123</b></a></td> 
    <td class="_4">July 21 1975</td> 
</tr> 

뭔가를 반환해야합니다. 이 예에서 204 바이트의 데이터 구조는 306 바이트의 HTML 파일이되었습니다. 테스트 결과 1,000 개가 넘는 문자가 표시되어야합니다. 비교 결과를 게시하는 경우 크기를 줄이기위한 아이디어를 줄 수 있습니다.

+0

코멘트 주셔서 감사합니다 ... 난 장고를 통해 HTML로 렌더링 해요, 나는 목록에있는 필수 필드를 보내고 있습니다. 그러나 우리가 당신이 제안한 것을 할 때 우리는 목록 컨테이너 na만의 크기를 얻습니다. 문자열과 날짜 객체 같은 내부 데이터는 어떻게 될까요? 우리는이 권리를 측정 할 수 없습니까? –

+0

콘솔에서도 작은 숫자를 얻고 있지만 html 페이지에서 렌더링 할 때 크기가 1kb인데 무슨 일이 일어 났는지 궁금하고 무엇을보아야하는지 모릅니다. 어떤 제안? 내가 한 일은 모든 레코드의 크기를 확인하는 것입니다 -> HTML에 대한 단일 목록을 렌더링하고 전체 페이지의 크기를 확인하면 약 42 kb + (js 파일의 일부 상수 등)이므로이 상수를 무시할 수 있습니다) 그런 다음 나는 43+ kb로 밝혀진 HTML 페이지에 2 개의 레코드를 렌더링하고 이렇게 조금 더 샘플링 한 후에 ... 레코드의 크기가 약 1kb임을 확인했습니다. –

+0

@turtle s : "하나의 레코드 "HTML로 렌더링 된 것처럼 보입니까? 자바 스크립트 onmouseover 속성 또는 뭔가 더미를 추가하고 있습니까? –

관련 문제