<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>k6/data on Grafana Labs</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-data/</link><description>Recent content in k6/data on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/k6/v2.3.x/javascript-api/k6-data/index.xml" rel="self" type="application/rss+xml"/><item><title>SharedArray</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-data/sharedarray/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-data/sharedarray/</guid><content><![CDATA[&lt;h1 id=&#34;sharedarray&#34;&gt;SharedArray&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;SharedArray&lt;/code&gt; is an array-like object that shares the underlying memory between VUs.
The function executes only once, and its result is saved in memory once.
When a script requests an element, k6 gives a &lt;em&gt;copy&lt;/em&gt; of that element.&lt;/p&gt;
&lt;p&gt;You must construct a &lt;code&gt;SharedArray&lt;/code&gt; in the 
    &lt;a href=&#34;/docs/k6/v2.3.x/using-k6/test-lifecycle/&#34;&gt;&lt;code&gt;init&lt;/code&gt; context&lt;/a&gt;.
Its constructor takes a name for the &lt;code&gt;SharedArray&lt;/code&gt; and a function that needs to return an array object itself:&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

const data = new SharedArray(&amp;#39;some name&amp;#39;, function () {
  const dataArray = [];
  // more operations
  return dataArray; // must be an array
});&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The name argument is required.
VUs are completely separate JS VMs, and k6 needs some way to identify the &lt;code&gt;SharedArray&lt;/code&gt; that it needs to return.
You can have multiple &lt;code&gt;SharedArrays&lt;/code&gt; and even load only some of them for given VUs,
though this is unlikely to have any performance benefit.&lt;/p&gt;
&lt;p&gt;Supported operations on a &lt;code&gt;SharedArray&lt;/code&gt; include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Getting the number of elements with &lt;code&gt;length&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Getting an element by its index using the normal syntax &lt;code&gt;array[index]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;for-of&lt;/code&gt; loops&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In most cases, you should be able to reduce the memory usage of an array data structure by wrapping it in a &lt;code&gt;SharedArray&lt;/code&gt;.
Once constructed, a &lt;code&gt;SharedArray&lt;/code&gt; is read-only, so &lt;strong&gt;you can&amp;rsquo;t use a SharedArray to communicate data between VUs&lt;/strong&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;Attempting to instantiate a &lt;code&gt;SharedArray&lt;/code&gt; outside of the 
    &lt;a href=&#34;/docs/k6/v2.3.x/using-k6/test-lifecycle/&#34;&gt;init context&lt;/a&gt; results in the exception &lt;code&gt;new SharedArray must be called in the init context&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This limitation will eventually be removed, but for now, the implication is that you can use &lt;code&gt;SharedArray&lt;/code&gt; to populate test data only at the very beginning of your test and not as a result of receiving data from a response (for example).&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;common-pitfalls&#34;&gt;Common pitfalls&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;SharedArray&lt;/code&gt; has a special underlying implementation that provides memory efficiency benefits.
However, certain operations can negate these benefits by converting the &lt;code&gt;SharedArray&lt;/code&gt; into a regular array or causing unnecessary marshalling.&lt;/p&gt;
&lt;h3 id=&#34;avoid-array-methods-that-create-new-arrays&#34;&gt;Avoid array methods that create new arrays&lt;/h3&gt;
&lt;p&gt;Methods like &lt;code&gt;.filter()&lt;/code&gt; and &lt;code&gt;.map()&lt;/code&gt; create regular arrays when called on a &lt;code&gt;SharedArray&lt;/code&gt;, which removes the memory-efficiency benefits.
Instead, use &lt;code&gt;.filter()&lt;/code&gt; or &lt;code&gt;.map()&lt;/code&gt; inside the &lt;code&gt;SharedArray&lt;/code&gt; constructor function, since that operation only happens once during initialization, or iterate over elements individually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t:&lt;/strong&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

const data = new SharedArray(&amp;#39;users&amp;#39;, function () {
  return JSON.parse(open(&amp;#39;./users.json&amp;#39;));
});

export default function () {
  // This creates a new regular array, losing SharedArray benefits
  const filtered = data.filter(user =&amp;gt; user.active);
  // ...
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Do:&lt;/strong&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

// Using filter/map inside the constructor is fine since it only runs once
const activeUsers = new SharedArray(&amp;#39;active users&amp;#39;, function () {
  const allUsers = JSON.parse(open(&amp;#39;./users.json&amp;#39;));
  return allUsers.filter(user =&amp;gt; user.active);
});

export default function () {
  const user = activeUsers[Math.floor(Math.random() * activeUsers.length)];
  // ...
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;avoid-marshalling-the-entire-sharedarray&#34;&gt;Avoid marshalling the entire SharedArray&lt;/h3&gt;
&lt;p&gt;When you marshal or serialize a &lt;code&gt;SharedArray&lt;/code&gt; (for example, with &lt;code&gt;JSON.stringify()&lt;/code&gt;), it converts to a regular array representation, which eliminates memory efficiency benefits.
Only marshal individual elements when needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t:&lt;/strong&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

const data = new SharedArray(&amp;#39;users&amp;#39;, function () {
  return JSON.parse(open(&amp;#39;./users.json&amp;#39;));
});

export default function () {
  // Marshalling the entire SharedArray defeats its purpose
  const serialized = JSON.stringify(data);
  // ...
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Do:&lt;/strong&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

const data = new SharedArray(&amp;#39;users&amp;#39;, function () {
  return JSON.parse(open(&amp;#39;./users.json&amp;#39;));
});

export default function () {
  // Marshal only the element you need
  const user = data[Math.floor(Math.random() * data.length)];
  const serialized = JSON.stringify(user);
  // ...
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;avoid-storing-a-single-large-object&#34;&gt;Avoid storing a single large object&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SharedArray&lt;/code&gt; is designed for arrays of elements, not for storing a single large object.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t:&lt;/strong&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

// Wrapping a single object in an array just to use SharedArray
const data = new SharedArray(&amp;#39;config&amp;#39;, function () {
  return [JSON.parse(open(&amp;#39;./large-config.json&amp;#39;))];
});

export default function () {
  const config = data[0];
  // ...
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;avoid-returning-sharedarray-from-setup&#34;&gt;Avoid returning SharedArray from setup()&lt;/h3&gt;
&lt;p&gt;When you return a &lt;code&gt;SharedArray&lt;/code&gt; from the &lt;code&gt;setup()&lt;/code&gt; function, k6 marshals it, which removes its memory efficiency benefits.
Keep &lt;code&gt;SharedArray&lt;/code&gt; instances in the init context instead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t:&lt;/strong&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

const data = new SharedArray(&amp;#39;users&amp;#39;, function () {
  return JSON.parse(open(&amp;#39;./users.json&amp;#39;));
});

export function setup() {
  // Returning SharedArray from setup causes it to be marshalled
  return { users: data };
}

export default function (setupData) {
  // setupData.users is now a regular array, not a SharedArray
  const user = setupData.users[0];
  // ...
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Do:&lt;/strong&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

// Keep SharedArray in init context
const users = new SharedArray(&amp;#39;users&amp;#39;, function () {
  return JSON.parse(open(&amp;#39;./users.json&amp;#39;));
});

export default function () {
  // Access SharedArray directly
  const user = users[Math.floor(Math.random() * users.length)];
  // ...
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;avoid-opening-files-outside-sharedarray-just-to-return-them-as-one&#34;&gt;Avoid opening files outside SharedArray just to return them as one&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SharedArray&lt;/code&gt; processes and stores data once in shared memory, then returns elements to VUs as requested. If you open the file in the &lt;code&gt;init&lt;/code&gt; context outside the SharedArray callback, each VU opens the file independently and holds its own copy of the data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t:&lt;/strong&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

const usersRaw = open(&amp;#39;./users.json&amp;#39;);
const usersJSON = JSON.parse(usersRaw);

// This doesn&amp;#39;t remove the work that was done before or reduce the memory used
const usersShared = new SharedArray(&amp;#39;users&amp;#39;, function () { return usersJSON; });

export default function () {
  // usersShared is now a regular array, not a SharedArray
  const user = usersShared[0];
  // ...
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Do:&lt;/strong&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

const users = new SharedArray(&amp;#39;users&amp;#39;, function () {
  // Here you can do additional work including only getting certain elements or filtering.
  return JSON.parse(open(&amp;#39;./users.json&amp;#39;));
});

export default function () {
  const user = users[Math.floor(Math.random() * users.length)];
  // ...
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { SharedArray } from &amp;#39;k6/data&amp;#39;;

const data = new SharedArray(&amp;#39;some name&amp;#39;, function () {
  // All heavy work (opening and processing big files for example) should be done inside here.
  // This way it will happen only once and the result will be shared between all VUs, saving time and memory.
  const f = JSON.parse(open(&amp;#39;./somefile.json&amp;#39;));
  return f; // f must be an array
});

export default function () {
  const element = data[Math.floor(Math.random() * data.length)];
  // do something with element
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;performance-characteristics&#34;&gt;Performance characteristics&lt;/h2&gt;
&lt;p&gt;Internally, the current implementation of &lt;code&gt;SharedArray&lt;/code&gt; keeps the data marshaled as JSON and unmarshals elements only when they are requested.&lt;/p&gt;
&lt;p&gt;In general, this operation should be unnoticeable (relative to whatever else you do with the data).
But, for small data sets, &lt;code&gt;SharedArray&lt;/code&gt; might perform worse.
However, this is highly dependent on use case.&lt;/p&gt;
&lt;p&gt;To test this, we ran the following script on version v0.31.0 with 100 VUs.&lt;/p&gt;
&lt;!-- md-k6:env.N=3 --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { check } from &amp;#39;k6&amp;#39;;
import http from &amp;#39;k6/http&amp;#39;;
import { SharedArray } from &amp;#39;k6/data&amp;#39;;

const n = parseInt(__ENV.N);
function generateArray() {
  const arr = new Array(n);
  for (let i = 0; i &amp;lt; n; i&amp;#43;&amp;#43;) {
    arr[i] = { something: &amp;#39;something else&amp;#39; &amp;#43; i, password: &amp;#39;12314561&amp;#39; };
  }
  return arr;
}

let data;
if (__ENV.SHARED === &amp;#39;true&amp;#39;) {
  data = new SharedArray(&amp;#39;my data&amp;#39;, generateArray);
} else {
  data = generateArray();
}

export default function () {
  const iterationData = data[Math.floor(Math.random() * data.length)];
  const res = http.post(&amp;#39;https://quickpizza.grafana.com/api/post&amp;#39;, JSON.stringify(iterationData), {
    headers: { &amp;#39;Content-type&amp;#39;: &amp;#39;application/json&amp;#39; },
  });
  check(res, { &amp;#39;status 200&amp;#39;: (r) =&amp;gt; r.status === 200 });
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As the table shows, performance didn&amp;rsquo;t differ much at lower numbers of data lines:
up until around 1000 data lines, &lt;code&gt;SharedArray&lt;/code&gt; shows little benefit in memory usage
and had a higher upper bound of CPU usage (though not substantially higher).&lt;/p&gt;
&lt;p&gt;At 10k lines and above, the memory savings started to heavily carry over to CPU savings as well.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;data lines&lt;/th&gt;
              &lt;th&gt;shared&lt;/th&gt;
              &lt;th&gt;wall time&lt;/th&gt;
              &lt;th&gt;CPU %&lt;/th&gt;
              &lt;th&gt;MEM usage&lt;/th&gt;
              &lt;th&gt;http requests&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;100&lt;/td&gt;
              &lt;td&gt;true&lt;/td&gt;
              &lt;td&gt;2:01:70&lt;/td&gt;
              &lt;td&gt;70-79%&lt;/td&gt;
              &lt;td&gt;213-217MB&lt;/td&gt;
              &lt;td&gt;92191-98837&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;100&lt;/td&gt;
              &lt;td&gt;false&lt;/td&gt;
              &lt;td&gt;2:01:80&lt;/td&gt;
              &lt;td&gt;74-75%&lt;/td&gt;
              &lt;td&gt;224-232MB&lt;/td&gt;
              &lt;td&gt;96851-98643&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;1000&lt;/td&gt;
              &lt;td&gt;true&lt;/td&gt;
              &lt;td&gt;2:01:60&lt;/td&gt;
              &lt;td&gt;74-79%&lt;/td&gt;
              &lt;td&gt;209-216MB&lt;/td&gt;
              &lt;td&gt;98251-98806&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;1000&lt;/td&gt;
              &lt;td&gt;false&lt;/td&gt;
              &lt;td&gt;2:01:90&lt;/td&gt;
              &lt;td&gt;75-77%&lt;/td&gt;
              &lt;td&gt;333-339MB&lt;/td&gt;
              &lt;td&gt;98069-98951&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;10000&lt;/td&gt;
              &lt;td&gt;true&lt;/td&gt;
              &lt;td&gt;2:01:70&lt;/td&gt;
              &lt;td&gt;78-79%&lt;/td&gt;
              &lt;td&gt;213-217MB&lt;/td&gt;
              &lt;td&gt;97953-98735&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;10000&lt;/td&gt;
              &lt;td&gt;false&lt;/td&gt;
              &lt;td&gt;2:03:00&lt;/td&gt;
              &lt;td&gt;80-83%&lt;/td&gt;
              &lt;td&gt;1364-1400MB&lt;/td&gt;
              &lt;td&gt;96816-98852&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;100000&lt;/td&gt;
              &lt;td&gt;true&lt;/td&gt;
              &lt;td&gt;2:02:20&lt;/td&gt;
              &lt;td&gt;78-79%&lt;/td&gt;
              &lt;td&gt;238-275MB&lt;/td&gt;
              &lt;td&gt;98103-98540&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;100000&lt;/td&gt;
              &lt;td&gt;false&lt;/td&gt;
              &lt;td&gt;2:14:00&lt;/td&gt;
              &lt;td&gt;120-124%&lt;/td&gt;
              &lt;td&gt;8.3-9.1GB&lt;/td&gt;
              &lt;td&gt;96003-97802&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;In v0.30.0, the difference in CPU usage at lower numbers was around 10-15%, but it also started to even out at around 10k data lines and was a clear winner at 100k.&lt;/p&gt;
&lt;p&gt;The CPU/memory data came from using &lt;code&gt;/usr/bin/time&lt;/code&gt;. Refer to the &lt;a href=&#34;https://gist.github.com/MStoykov/1181cfa6f00bc56b90915155f885e2bb&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;gist with the raw data&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These numbers are purely illustrative: the performance can be affected by any additional processing of the element retrieved from the &lt;code&gt;SharedArray&lt;/code&gt;, or if an output is in use, or it gets multiple elements, etc.
While &lt;code&gt;SharedArray&lt;/code&gt; has some CPU usage,
it might turn out to be negligible in a given situation with just 10 elements, or more problematic than the memory usage for a 100k elements.
So, if in doubt, you should probably run some benchmarks and decide which tradeoffs are more important for your use case.&lt;/p&gt;
]]></content><description>&lt;h1 id="sharedarray">SharedArray&lt;/h1>
&lt;p>&lt;code>SharedArray&lt;/code> is an array-like object that shares the underlying memory between VUs.
The function executes only once, and its result is saved in memory once.
When a script requests an element, k6 gives a &lt;em>copy&lt;/em> of that element.&lt;/p></description></item></channel></rss>