QListView 아이템 추가, 삭제 업데이트 시 느려지는 문제점

kjh27814의 이미지

안녕하세요.

ListView에 모델을 등록해서 사용하는 중인데

이게 4만개정도의 항목에 대해서는 입력 / 삭제가 그나마 빠른편입니다.

하지만 데이터가 10만개가 넘어가게 되면 데이터를 입력 / 삭제를 할 때 프로그램이 한창 굳어있다가

입력이 되거나 삭제가 됩니다.

데이터가 입력 될 때 마다 datachanged 함수를 부르는데 하나씩 입력할때는 해당 index에 대해서만 업데이트를 하고

여러개를 한번에 입력하면 시작 index와 종료 index에 대해 업데이트를 합니다.

thread를 이용해 보는 방법도 생각해봐서 구글에 찾아보니 모델의 data()함수가 GUI thread에서 밖에 동작하지 않아 thread화는 불가능하다고 나오더군요.

혹시 다른 해결방법 없을까요?

답변 부탁드리겠습니다.

klara의 이미지

kjh27814의 이미지

근데 여러개를 한번에 입력할 땐 빠른편인데 하나만 입력할때는 좀 느리네요 ㅜㅜ

무엇이 원인일까요?

klara의 이미지

setUniformItemSize()를 적용했더니 그렇게 됬다는 뜻인가요?
그리고 하나를 삽입하는데 걸리는 시간이 10개를 삽입할때 걸리는 시간보다 길다는 뜻인가요?
아니면 하나를 삽입하는데 걸리는 시간이 10개를 삽립할때 걸리는 개당 평균시간보다 길다는 뜻인가요?
삽입알고리즘에 시간이 오래걸리는건지, GUI update에 오래걸리는건지 확인해보셨나요?
아이템을 삽입할 때, insertRows()를 이용하시나요? 그리고 삽입 전후에 beginInsertRows()와 endInsertRows()를 호출하시나요?

kjh27814의 이미지

답변 감사드립니다.

초기에 여러개를 삽입 한 후 그 다음부터 사용자가 하나씩 삽입하는 방식인데

초기에 여러개를 삽입하는 속도는 굉장히 빠릅니다.

근데 사용자가 하나를 삽입 할 때는 약간 딜레이가 있습니다.

아이템을 삽입 할 때는 insertrows()를 사용하고 있으며(오버라이딩 시켜서 내부에서 beginInsertRows()와 endInsertRows()를 호출합니다.)

초기에 여러개를 삽입 할 때나 하나를 삽입 할 때 쓰는 알고리즘은 똑같습니다.

klara의 이미지

알고리즘이 같고 다른거랑 상관없이, 실제로 시간을 측정해보세요.
더불어 모델클래스는 QAbstractItemModel을 이용하고 계신가요?

익명 사용자의 이미지

예전에 비슷한 문제에 처한 적이 있었는데, 모델의 크기가 커지면 느려지더군요.
실제로 화면에 적게 표현이 되도, 내부적으로는 업데이트가 돌아가는 것 같았습니다.
그래서 다른 모델을 하나 더 두고, 리스트의 모델에서는 화면에 뿌려지는 것만 억세스 해서 불러오도록 고쳤습니다.
그런데, 그때는 Qt3였고, 이후에는 대용량을 리스트에 넣은적이 없어서, 지금도 그런지는 잘 모르겠네요.

kjh27814의 이미지

답변 감사드립니다.

kjh27814의 이미지

초기 400만개 데이터 삽입 시 3초, 그 이후 사용자가 데이터 삽입 시 10초 가량 걸립니다.

모델은 QStringListModel을 상속받아 사용하고 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.