Performance issue when 2k series in the specific study

Hi

We are facing issue of loading and performance related in the study detail page when above 2k series in the study.

We raised question to Orthanc community for Orthnac performance regarding this issue and we have been suggests to tried to set the option “SeriesMetadata” of the Orthanc DICOMweb plugin to “MainDicomTags” or “Extrapolate”. (Default is “FULL” mode)

Does anyone have apply this or guide us for the changes in viewer. (Right now we are using OHIF viewer version 3.3)

Thanks,
Mehul

please post:

  • console messages
  • viewer config
  • orthanc config

Hi,

Thanks for the advice and apology for the late reply.
Below are the requested details:

  1. Viewer browser console log:
    [HMR] Waiting for update signal from WDS…
    index.js:551 [webpack-dev-server] Hot Module Replacement enabled.
    index.js:551 [webpack-dev-server] Live Reloading enabled.
    init.js:23 CornerstoneRender: Using detect-gpu to get the GPU benchmark: {device: undefined, fps: 42, gpu: ‘intel mesa dri intel uhd graphics 630’, isMobile: false, tier: 2, …}
    init.js:29 CornerstoneRender: using GPU rendering
    MeasurementService.js:233 New ‘Cornerstone3DTools@0.1’ source added.
    MeasurementService.js:303 New measurement mapping added to source ‘Cornerstone3DTools@0.1’.
    MeasurementService.js:303 New measurement mapping added to source ‘Cornerstone3DTools@0.1’.
    MeasurementService.js:303 New measurement mapping added to source ‘Cornerstone3DTools@0.1’.
    MeasurementService.js:303 New measurement mapping added to source ‘Cornerstone3DTools@0.1’.
    MeasurementService.js:303 New measurement mapping added to source ‘Cornerstone3DTools@0.1’.
    dicomweb-client.es.js:833 search for studies
    dicomweb-client.es.js:833 search for studies
    dicomweb-client.es.js:873 search series of study 1.2.156.112605.189250943206629.230120145717.2.11372.15167
    DragAndDropProvider.tsx:25 using… touch backend? false
    HotkeysManager.js:198 [hotkeys] Binding setToolActive with {“toolName”:“Zoom”} options to z
    HotkeysManager.js:198 [hotkeys] Binding scaleUpViewport with no options to +
    HotkeysManager.js:198 [hotkeys] Binding scaleDownViewport with no options to -
    HotkeysManager.js:198 [hotkeys] Binding fitViewportToWindow with no options to =
    HotkeysManager.js:198 [hotkeys] Binding rotateViewportCW with no options to r
    HotkeysManager.js:198 [hotkeys] Binding rotateViewportCCW with no options to l
    HotkeysManager.js:198 [hotkeys] Binding flipViewportHorizontal with no options to h
    HotkeysManager.js:198 [hotkeys] Binding flipViewportVertical with no options to v
    HotkeysManager.js:198 [hotkeys] Binding toggleCine with no options to c
    HotkeysManager.js:198 [hotkeys] Binding invertViewport with no options to i
    HotkeysManager.js:198 [hotkeys] Binding incrementActiveViewport with no options to right
    HotkeysManager.js:198 [hotkeys] Binding decrementActiveViewport with no options to left
    HotkeysManager.js:198 [hotkeys] Binding nextImage with no options to down
    HotkeysManager.js:198 [hotkeys] Binding previousImage with no options to up
    HotkeysManager.js:198 [hotkeys] Binding firstImage with no options to home
    HotkeysManager.js:198 [hotkeys] Binding lastImage with no options to end
    HotkeysManager.js:198 [hotkeys] Binding resetViewport with no options to space
    HotkeysManager.js:198 [hotkeys] Binding cancelMeasurement with no options to esc
    HotkeysManager.js:198 [hotkeys] Binding setWindowLevel with {“description”:“Soft tissue”,“window”:“400”,“level”:“40”} options to 1
    HotkeysManager.js:198 [hotkeys] Binding setWindowLevel with {“description”:“Lung”,“window”:“1500”,“level”:“-600”} options to 2
    HotkeysManager.js:198 [hotkeys] Binding setWindowLevel with {“description”:“Liver”,“window”:“150”,“level”:“90”} options to 3
    HotkeysManager.js:198 [hotkeys] Binding setWindowLevel with {“description”:“Bone”,“window”:“2500”,“level”:“480”} options to 4
    HotkeysManager.js:198 [hotkeys] Binding setWindowLevel with {“description”:“Brain”,“window”:“80”,“level”:“40”} options to 5
    HotkeysManager.js:198 [hotkeys] Binding setWindowLevel with {“description”:“Trest”,“window”:“1”,“level”:“1”} options to 6
    HotkeysManager.js:198 [hotkeys] Binding setWindowLevel with {“description”:“Empty1”,“window”:“Empty1”,“level”:“Empty1”} options to 7
    HotkeysManager.js:198 [hotkeys] Binding setWindowLevel with {“description”:“Empty2”,“window”:“Empty2”,“level”:“Empty2”} options to 8
    HotkeysManager.js:198 [hotkeys] Binding setWindowLevel with {“description”:“Empty3”,“window”:“Empty3”,“level”:“Empty3”} options to 9
    DragAndDropProvider.tsx:25 using… touch backend? false
    DragAndDropProvider.tsx:25 using… touch backend? false
    dicomweb-client.es.js:833 search for studies
    dicomweb-client.es.js:873 search series of study 1.2.156.112605.189250943206629.230120145717.2.11372.15167
    dicomweb-client.es.js:833 search for studies
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150126.3.7288.21612
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150126.3.7288.41612
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150126.3.7288.51612
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150126.3.7288.61612
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150126.3.7288.71612
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150132.3.7288.48516
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150132.3.7288.58516
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150132.3.7288.68516
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150132.3.7288.78516
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120150337.3.7288.23558
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120170707.3.964.136622
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120170812.3.964.137662
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120170910.3.964.105542
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120170938.3.964.135922
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120171140.3.964.194172
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120171325.3.964.109502
    dicomweb-client.es.js:903 retrieve metadata of series 1.2.156.112605.189250943206629.230120171327.3.964.189472

=================================================
2. Terminal console log:
yarn run v1.22.18
$ lerna run dev:viewer --stream
lerna notice cli v3.22.1
lerna info versioning independent
lerna info Executing command in 1 package: “yarn run dev:viewer”
@ohif/viewer: $ yarn run dev
@ohif/viewer: $ cross-env NODE_ENV=development webpack serve --config .webpack/webpack.pwa.js
@ohif/viewer: copy plugins
@ohif/viewer: Failed to load ./.env.
@ohif/viewer: Browserslist: caniuse-lite is outdated. Please run:
@ohif/viewer: npx browserslist@latest --update-db
@ohif/viewer: Why you should do it regularly:
@ohif/viewer: [webpack-dev-server] “hot: true” automatically applies HMR plugin, you don’t have to add it manually to your webpack configuration.
@ohif/viewer: [webpack-dev-server] [HPM] Proxy created: /dicomweb →
@ohif/viewer: [webpack-dev-server] Project is running at:
@ohif/viewer: [webpack-dev-server] Loopback:
@ohif/viewer: [webpack-dev-server] On Your Network (IPv4):
@ohif/viewer: [webpack-dev-server] Content not from webpack is served from ‘…/…/testdata’ directory
@ohif/viewer: [webpack-dev-server] 404s will fallback to ‘/index.html’
@ohif/viewer: [webpack-dev-middleware] wait until bundle finished: /
@ohif/viewer: assets by path assets/ 318 KiB 48 assets
@ohif/viewer: assets by path *.js 38.8 MiB 19 assets
@ohif/viewer: assets by path *.map 1.23 MiB 4 assets
@ohif/viewer: assets by path *.wasm 471 KiB 3 assets
@ohif/viewer: assets by path *.svg 32.3 KiB
@ohif/viewer: asset ohif-logo.svg 16.2 KiB [emitted] [from: …/public/ohif-logo.svg] [copied]
@ohif/viewer: asset ohif-logo-light.svg 16.2 KiB [emitted] [from: …/public/ohif-logo-light.svg] [copied]
@ohif/viewer: assets by path *.html 6.94 KiB
@ohif/viewer: asset index.html 6.37 KiB [emitted]
@ohif/viewer: asset silent-refresh.html 579 bytes [emitted] [from: …/public/silent-refresh.html] [copied]
@ohif/viewer: asset manifest.json 1.28 KiB [emitted] [from: …/public/manifest.json] [copied]
@ohif/viewer: asset _headers 258 bytes [emitted] [from: …/public/_headers] [copied]
@ohif/viewer: asset _redirects 149 bytes [emitted] [from: …/public/_redirects] [copied]
@ohif/viewer: LOG from InjectManifest
@ohif/viewer: The service worker at sw.js will precache
@ohif/viewer: 79 URLs, totaling 3.37 MB.
@ohif/viewer: WARNING in /app.js is 39.4 MB, and won’t be precached. Configure maximumFileSizeToCacheInBytes to change this limit.
@ohif/viewer: webpack 5.72.1 compiled with 1 warning in 21030 ms (f9fc805bcf2901acbdd9)
@ohif/viewer: [webpack-dev-middleware] wait until bundle finished: /app-config.js
@ohif/viewer: [webpack-dev-middleware] wait until bundle finished: /init-service-worker.js
@ohif/viewer: assets by status 3.21 MiB [cached] 78 assets
@ohif/viewer: assets by status 37.6 MiB [emitted]
@ohif/viewer: assets by path *.js 37.6 MiB
@ohif/viewer: asset app.js 37.6 MiB [emitted] (name: app)
@ohif/viewer: asset sw.js 15.6 KiB [emitted]
@ohif/viewer: asset app.f9fc805bcf2901acbdd9.hot-update.js 854 bytes [emitted] [immutable] [hmr] (name: app)
@ohif/viewer: asset index.html 6.37 KiB [emitted]
@ohif/viewer: asset app.f9fc805bcf2901acbdd9.hot-update.json 27 bytes [emitted] [immutable] [hmr]
@ohif/viewer: Entrypoint app 37.6 MiB = app.js 37.6 MiB app.f9fc805bcf2901acbdd9.hot-update.js 854 bytes
@ohif/viewer: LOG from InjectManifest
@ohif/viewer: The service worker at sw.js will precache
@ohif/viewer: 81 URLs, totaling 3.38 MB.
@ohif/viewer: WARNING in InjectManifest has been called multiple times, perhaps due to running webpack in --watch mode. The precache manifest generated after the first call may be inaccurate! Please see Precache manifest missing entries when recompiled via webpack --watch · Issue #1790 · GoogleChrome/workbox · GitHub for more information.
@ohif/viewer: WARNING in /app.js is 39.4 MB, and won’t be precached. Configure maximumFileSizeToCacheInBytes to change this limit.
@ohif/viewer: webpack 5.72.1 compiled with 2 warnings in 2744 ms (5b3e318d8222a6c0cfd4)
@ohif/viewer: assets by status 40.8 MiB [cached] 79 assets
@ohif/viewer: assets by path . 21.9 KiB
@ohif/viewer: asset sw.js 15.5 KiB [emitted]
@ohif/viewer: asset index.html 6.37 KiB [emitted]
@ohif/viewer: LOG from InjectManifest
@ohif/viewer: The service worker at sw.js will precache
@ohif/viewer: 79 URLs, totaling 3.37 MB.
@ohif/viewer: WARNING in InjectManifest has been called multiple times, perhaps due to running webpack in --watch mode. The precache manifest generated after the first call may be inaccurate! Please see Precache manifest missing entries when recompiled via webpack --watch · Issue #1790 · GoogleChrome/workbox · GitHub for more information.
@ohif/viewer: WARNING in /app.js is 39.4 MB, and won’t be precached. Configure maximumFileSizeToCacheInBytes to change this limit.
@ohif/viewer: webpack 5.72.1 compiled with 2 warnings in 458 ms (5b3e318d8222a6c0cfd4)

=================================================
3. Viewer config
window.config = {
routerBasename: ‘/’,
// whiteLabelling: {},
extensions: ,
modes: ,
customizationService: {
// helloPage: ‘@ohif/extension-default.customizationModule.helloPage’,
},
showStudyList: true,
maxNumberOfWebWorkers: 4,
// below flag is for performance reasons, but it might not work for all servers
omitQuotationForMultipartRequest: true,
showLoadingIndicator: true,
maxNumRequests: {
interaction: 100,
thumbnail: 75,
prefetch: 10,
},
// filterQueryParam: false,
dataSources: [
{
friendlyName: ‘dcmjs DICOMWeb Server’,
namespace: ‘@ohif/extension-default.dataSourcesModule.dicomweb’,
sourceName: ‘dicomweb’,
configuration: {
name: ‘aws’,
// new server
wadoUriRoot: ‘/dicom-web/wado’,
qidoRoot: ‘/dicom-web’,
wadoRoot: ‘/dicom-web’,
qidoSupportsIncludeField: false,
supportsReject: false,
imageRendering: ‘wadors’,
thumbnailRendering: ‘wadors’,
enableStudyLazyLoad: true,
supportsFuzzyMatching: false,
supportsWildcard: true,
staticWado: true,
singlepart: ‘bulkdata,video,pdf’,
},
},
{
friendlyName: ‘dicom json’,
namespace: ‘@ohif/extension-default.dataSourcesModule.dicomjson’,
sourceName: ‘dicomjson’,
configuration: {
name: ‘json’,
},
},
{
friendlyName: ‘dicom local’,
namespace: ‘@ohif/extension-default.dataSourcesModule.dicomlocal’,
sourceName: ‘dicomlocal’,
configuration: {},
},
],
httpErrorHandler: error => {
// This is 429 when rejected from the public idc sandbox too often.
console.warn(error.status);

// Could use services manager here to bring up a dialog/modal if needed

},
// whiteLabeling: {
// /* Optional: Should return a React component to be rendered in the “Logo” section of the application’s Top Navigation bar */
// createLogoComponentFn: function (React) {
// return React.createElement(
// ‘a’,
// {
// target: ‘_self’,
// rel: ‘noopener noreferrer’,
// className: ‘text-purple-600 line-through’,
// href: ‘/’,
// },
// React.createElement(‘img’,
// {
// src: ‘./customLogo.svg’,
// className: ‘w-8 h-8’,
// }
// ))
// },
// },
defaultDataSourceName: ‘dicomweb’,
hotkeys: [
{
commandName: ‘incrementActiveViewport’,
label: ‘Next Viewport’,
keys: [‘right’],
},
{
commandName: ‘decrementActiveViewport’,
label: ‘Previous Viewport’,
keys: [‘left’],
},
{ commandName: ‘rotateViewportCW’, label: ‘Rotate Right’, keys: [‘r’] },
{ commandName: ‘rotateViewportCCW’, label: ‘Rotate Left’, keys: [‘l’] },
{ commandName: ‘invertViewport’, label: ‘Invert’, keys: [‘i’] },
{
commandName: ‘flipViewportHorizontal’,
label: ‘Flip Horizontally’,
keys: [‘h’],
},
{
commandName: ‘flipViewportVertical’,
label: ‘Flip Vertically’,
keys: [‘v’],
},
{ commandName: ‘scaleUpViewport’, label: ‘Zoom In’, keys: [‘+’] },
{ commandName: ‘scaleDownViewport’, label: ‘Zoom Out’, keys: [‘-’] },
{ commandName: ‘fitViewportToWindow’, label: ‘Zoom to Fit’, keys: [‘=’] },
{ commandName: ‘resetViewport’, label: ‘Reset’, keys: [‘space’] },
{ commandName: ‘nextImage’, label: ‘Next Image’, keys: [‘down’] },
{ commandName: ‘previousImage’, label: ‘Previous Image’, keys: [‘up’] },
// {
// commandName: ‘previousViewportDisplaySet’,
// label: ‘Previous Series’,
// keys: [‘pagedown’],
// },
// {
// commandName: ‘nextViewportDisplaySet’,
// label: ‘Next Series’,
// keys: [‘pageup’],
// },
{
commandName: ‘setToolActive’,
commandOptions: { toolName: ‘Zoom’ },
label: ‘Zoom’,
keys: [‘z’],
},
// ~ Window level presets
{
commandName: ‘windowLevelPreset1’,
label: ‘W/L Preset 1’,
keys: [‘1’],
},
{
commandName: ‘windowLevelPreset2’,
label: ‘W/L Preset 2’,
keys: [‘2’],
},
{
commandName: ‘windowLevelPreset3’,
label: ‘W/L Preset 3’,
keys: [‘3’],
},
{
commandName: ‘windowLevelPreset4’,
label: ‘W/L Preset 4’,
keys: [‘4’],
},
{
commandName: ‘windowLevelPreset5’,
label: ‘W/L Preset 5’,
keys: [‘5’],
},
{
commandName: ‘windowLevelPreset6’,
label: ‘W/L Preset 6’,
keys: [‘6’],
},
{
commandName: ‘windowLevelPreset7’,
label: ‘W/L Preset 7’,
keys: [‘7’],
},
{
commandName: ‘windowLevelPreset8’,
label: ‘W/L Preset 8’,
keys: [‘8’],
},
{
commandName: ‘windowLevelPreset9’,
label: ‘W/L Preset 9’,
keys: [‘9’],
},
],
};

=================================================
4. Orthanc config

{
“Name”: “Orthanc”,
“StorageDirectory”: “/var/www/html/db-v6”,
“IndexDirectory”: “/var/www/html/db-v6”,
“PathStorage”: “/var/www/html/db-v6”,
“StorageCompression”: false,
“MaximumStorageSize”: 0,
“MaximumPatientCount”: 0,
“LuaScripts”: ,
“Plugins”: [
“/usr/share/orthanc/plugins/”,
“/usr/share/orthanc/orthanc-transfers/BuildTransfers/libOrthancTransfers.so”
],
“ConcurrentJobs”: 2,
“HttpServerEnabled”: true,
“HttpPort”: 8042,
“HttpDescribeErrors”: true,
“HttpCompressionEnabled”: true,
“DicomServerEnabled”: true,
“DicomAet”: “ORTHANC”,
“DicomCheckCalledAet”: true,
“DicomPort”: 4200,
“DefaultEncoding”: “Latin1”,
“DeflatedTransferSyntaxAccepted”: true,
“JpegTransferSyntaxAccepted”: true,
“Jpeg2000TransferSyntaxAccepted”: true,
“JpegLosslessTransferSyntaxAccepted”: true,
“JpipTransferSyntaxAccepted”: true,
“Mpeg2TransferSyntaxAccepted”: true,
“RleTransferSyntaxAccepted”: true,
“UnknownSopClassAccepted”: false,
“DicomScpTimeout”: 300,
“RemoteAccessAllowed”: true,
“SslEnabled”: false,
“SslCertificate”: “certificate.pem”,
“AuthenticationEnabled”: true,
“RegisteredUsers”: { “orthanc”: “orthanc” },
“DicomModalities”: {},
“DicomModalitiesInDatabase”: true,
“DicomAlwaysAllowEcho”: true,
“DicomAlwaysAllowStore”: true,
“DicomCheckModalityHost”: false,
“DicomScuTimeout”: 30,
“OrthancPeers”: { },
“OrthancPeersInDatabase”: true,
“HttpProxy”: “”,
“HttpVerbose”: false,
“HttpTimeout”: 60,
“HttpsVerifyPeers”: true,
“HttpsCACertificates”: “”,
“UserMetadata”: {},
“UserContentType”: {},
“StableAge”: 60,
“StrictAetComparison”: false,
“StoreMD5ForAttachments”: true,
“LimitFindResults”: 0,
“LimitFindInstances”: 0,
“LimitJobs”: 10,
“LogExportedResources”: false,
“KeepAlive”: true,
“TcpNoDelay”: true,
“HttpThreadsCount”: 50,
“StoreDicom”: true,
“DicomAssociationCloseDelay”: 5,
“QueryRetrieveSize”: 100,
“CaseSensitivePN”: false,
“LoadPrivateDictionary”: true,
“Dictionary”: {},
“SynchronousCMove”: true,
“JobsHistorySize”: 10,
“SaveJobs”: true,
“OverwriteInstances”: false,
“MediaArchiveSize”: 1,
“StorageAccessOnFind”: “Always”,
“MetricsEnabled”: true,
“ExecuteLuaEnabled”: false,
“HttpRequestTimeout”: 30
}

Thanks

upgrade to orthanc 1.11.2