Sunday, May 17, 2015

Extreme Contrast Enhancer for Monitors in sunlight!

One word:Shades.

If you like to work outside like me, get shades big enough for the wall behind you.

Paint the other side of shades black, and the other side stays white.


Magic shades in Normal (ECO) mode. Can't see what's on monitor in bright sunlight.


Magic shades in Ex3m Contrast Enhancer (tm) mode.
Notice how the back of Lg monitor changes from black to white when camera adjusts shutter speed.

Now the same treatment to my home theater.

This should also work with window shades. Paint the inside shades in gray color ( not necessarily black). Place LED lights above or under window in that way that when the shades are in 45 degree angle and gray shades are inside and white shades outside, you can see outside even in the evening because the gray shades are not too bright. But from outside you cannot see inside because the LED light is reflected outside from the white shades. All you can see is bright shades.

Tekgear Twiddler3 : yhden käden langaton näppäimistö

Olin syksyllä etsimässa näppäimistöä joka sopisi yhden käden käyttöön ja kuin tilauksesta Tekgear oli samaan aikaan valmistelemassa Twiddlerin julkistamista. Muistan samanlaisia kitaraotteeseen perustuvia näppäimistöjä olleen jo 80-luvulla, mutta silloin tekniikka ei ollut vielä tarpeeksi kehittynyttä.


Twiddler3 ohittaa entiset vajavaisuudet ollen täydellisesti käteensopiva langaton bluetooth näppäimistö. Hinta on hieman korkea 200 euroa, mutta toisaalta tämä sallii täydellisen vapauden kirjoittamispaikasta kun nytkin kirjoitan yhdessä Helsingin rantakadun kahviloista. Kirjaimet luodaan yhden tai useamman näppäimen yhdistelmällä.

 

Ylläolevasta kuvasta näkyy luomani "cheatsheet". Vasemman puolen kirjaimet eivät vaadi kuin yhden näppäimen painamisen mutta keskimmäisiin vaaditaan ylimmän rivin oikea näppäin mukaan sekä oikeanpuolimmaisiin ylemmän rivin keskimmäinen näppäin. Lisäksi olen tehnyt oman konfiguraation missä skandinaaviset näppämet saadaan ylimmän rivin vasemmalla näppäimellä.

Koska näppäimistö poikkeaa niin paljon muista näppäimistöistä vie sen opettelu aikansa, mutta jos sinulla on visio Twiddler3:n mahdollisista käyttötarpeista niin se aika ei ole hukkaanheitettyä.

Twiddler on vapaasti muunneltavissa konfiguraatiotiedostoilla ja näppäinyhdistelmiä on niin suuri määrä että taitojen lisääntyessä voi luoda makroja, jolloin tietty näppäinyhdistelmä voi tuottaa tavuja tai kokonaisia lauseita. Olen tehnyt Twiddler3:een kaksi skriptiä, joilla on helppo luoda uusia konfiguraatioita. Tekgearilla on omakin nettiportaali, jossa voi suunitella näppäinkonfiguuraatioita mutta se ei tue skandinaavisia näppäimiä. Lisäksi se on hieman hidaskäyttöinen, jolloin suurempia muutoksi tehtäessä tekstitiedosto onkin nopeampi tapa. Luomaani tekstiformaattiin voi lisäksi lisätä myös kommentteja sekä näppäimet voi järjestellä haluamaansa järjestykseen mikä helpottaa suunnittelua.

Olen luonut suomenkielisen konfiguraation missä ei ole vielä kaikkia erikoisnäppäimiä mutta peruskirjoittaminen onnistuu jo. Osaan itsekin vasta tavalliset aakkoset, jota sitten laajennan kirjain kerrallaan.
twiddler.cfg skandeille binaarimuodossa

En löytänyt Androidille sovellusta, joka lukisi ääneen kirjoittamani tekstin joten tein sellaisen itse.
Se käyttää Googlen Text-to-speechiä, mutta versio 2:sta, jolloin ei ole saatavissa suomenkielistä ääntämystä vaan teksti luetaan vahvasti americalaisittain ääntäen. Se kuitenkin mahdollistaa pitkienkin tekstien kirjoittamisen ilman että tarvitsee jatkuvasti pitää kännykän näyttöä esillä.
Tekstin voi tarvittaessa laittaa kuulumaan kuulokkeilla, joilloin puheääni ei kuulu muille ympärilläolijoille
TwiddlerWriter

Kirjoitusnopeuteni on parin viikon harjoittelun jälkeen vasta noin puolet tavallisen näppäimistön nopeudesta, mutta vasta nyt olen päässyt kirjoittamaan oikeaa tekstiä kun olen saanut myös skandinaaviset näppäimet käyttöön.

Bussissa kirjoittaminen kannettavalla tai tabletilla on ollut hieman hankalaa bussin liikkuessa joten Twiddlerillä sekin onnistuu ongelmitta. Samoin voisin kuvitella että kahvilat ja terassit ovat oivia käyttökohteita. Käyttöpaikkoja twiddlerillä on kuitenkin paljon etenkin kesän jo ollessa ovella.

Tässä yksi taannoin Nuuksiossa käydessäni.


Tuesday, April 28, 2015

RecordBreaker - Simple Android app for keeping the running pace or breaking speed records.

Simple app for keeping the running pace or breaking speed records.

You enter the target speed and alert levels and the app speaks the difference of current speed to target speed in kilometers/hour. Just put on your bluetooth headset and you have a much cheaper version of Recon HUD.

There are two different alerts, one when you are slower than target and one for faster speeds.
You can set different pitches of speech for both alerts so you can recognize which alert you are hearing.

You can also set "safe zone" around target speed where no readings are read aloud.

Software uses GPS location and haversine formula to calculate speed. Doppler data not used, sorry.
If you set output filename, app also logs the measurements to file.

The app uses no network. Therefore you might need to install first some other app that uses Google Text-to-speech and installs it. I chose the "no network" road that you might feel more safe with app. No ads.

Settings:
UpperFarLimit: Speeds >= TargetSpeed + UpperFarLimit are not read aloud.
UpperPitch: Speech pitch for faster than target speed alerts.
UpperNearLimit: Speeds >= TargetSpeed + UpperNearLimit are read aloud.
TargetSpeed: One setting to set the target speed.
LowerNearLimit: Speeds <= TargetSpeed - UpperNearLimit are read aloud.
LowerPitch: Speech pitch for slower than target speed limits.
LowerFarLimit: Speeds <= TargetSpeed - UpperFarLimit are not read aloud.
Measuring interval: GPS measuring interval in seconds. Depends on your hardware.
Log File: File name for log file. If empty, no log file.
Read Interval: Sets how often alerts are read aloud. When set for instance to 3, every third GPS measurement is read aloud. Every measurement will still be written to screen and to log file.

RecordBreaker

TwiddlerWriter - app for writing memos and email with wireless keyboard like Twiddler3

I wrote a small app for writing texts with only my Twiddler3 and bluetooth headset:

TwiddlerWriter is an app for writing memos or emails with Twiddler one-hand keyboard. Every alphabet or word is read out loud so you don't have to look at your phone while you are writing. You can write while walking or commuting or like me right now sitting in my balcony in sunlight while having a cup of coffee.

TwiddlerWriter is meant to be a simple text entering app where you write only your raw text and copy&paste the text to actual app you will be using your text.

With 'Copy Text' button you can copy the whole text to clipboard.
'Read All' button reads aloud the whole text.
In 'Settings' you can change the pitch and other properties of voice and what are read: only keys, only words or both.

Because app is written with a simple framework you can only write to end of textbox. If you move the cursor to somewhere else than the end of text it will not read the text properly.

The app does not require you to have a Twiddler keyboard. You can of course use app with any kind of keyboard but with a wireless keyboard using this app makes sense.

The app uses no network. Therefore you might need to install first some other app that uses Google Text-to-speech and installs it. I chose the "no network" road that you might feel more safe with app. No ads.

TwiddlerWriter

Thursday, April 16, 2015

Changing Oracle partitioned table to using interval feature

Oracle 11g has new feature to allows for automatic creation of new partitions. It's easy to create table that for instance has automatic range partitions for every month. But how can you change already partitioned table to using interval partitions?

First of all, you cannot have partition that is the 'last' partition meaning it's high_value is MAX_VALUE. You have to delete that partition somehow.There are some methods for doing that but I'll go for easy one.

The examples I have copied from
Rittman Mead.com:Investigating Oracle 11g interval partitioning
I'll explain later why.

First create normally partitioned table
CREATE TABLE INTERVAL_SALES
      ( prod_id        NUMBER(6)
      , cust_id        NUMBER
      , time_id        DATE
      , channel_id     CHAR(1)
     , promo_id       NUMBER(6)
     , quantity_sold  NUMBER(3)
     , amount_sold    NUMBER(10,2)
     )
   PARTITION BY RANGE (time_id)
      ( PARTITION p0 VALUES LESS THAN (TO_DATE('01-01-2005', 'DD-MM-YYYY')),
        PARTITION p1 VALUES LESS THAN (TO_DATE('01-01-2006', 'DD-MM-YYYY')),
        PARTITION p3 VALUES LESS THAN (TO_DATE('01-01-2007', 'DD-MM-YYYY')),
        PARTITION p4 VALUES LESS THAN (MAXVALUE)
        );

-- add some old data
insert into interval_sales values (1,2,to_date('20041201', 'YYYYMMDD'),'d',3,4,9.9);
insert into interval_sales values (1,2,to_date('20051201', 'YYYYMMDD'),'d',3,4,9.9);
insert into interval_sales values (1,2,to_date('20061201', 'YYYYMMDD'),'d',3,4,9.9);
insert into interval_sales values (1,2,to_date('20070101', 'YYYYMMDD'),'d',3,4,9.9);
commit;

-- Show how rows are distributed in partitions
analyze table INTERVAL_SALES compute statistics;
SELECT
   PARTITION_NAME "NAME",
   PARTITION_POSITION "POSITION",
   NUM_ROWS,
   HIGH_VALUE
FROM
   USER_TAB_PARTITIONS
WHERE
   TABLE_NAME in ('INTERVAL_SALES')
ORDER BY
   PARTITION_POSITION;


NAME     POSITION   NUM_ROWS HIGH_VALUE
------ ---------- ---------- --------------------------------------------------------------------------------
P0              1          1 TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P1              2          1 TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P3              3          1 TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P4              4          1 MAXVALUE



We cannot drop the last partition because it already contains data.

So we split the partition. It's best to split to partition sizes that you are going to use in interval.

alter table interval_sales
split partition P4
at ( to_date( '20070201', 'YYYYMMDD' ) )
into ( partition PART200701, partition PART_LAST ) update global indexes;


If you have already a lot of data, this may take some time....

Analyze table and query partition data:

NAME         POSITION   NUM_ROWS HIGH_VALUE
---------- ---------- ---------- --------------------------------------------------------------------------------
P0                  1          1 TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P1                  2          1 TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P3                  3          1 TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
PART200701          4          1 TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
PART_LAST           5          0 MAXVALUE


If you still have data in last partition , split some more.
But like I said, this is not the fastest method. Every split has to read&write all rows in partition.

But the last partition is now empty, so we can drop it.
alter table interval_sales drop partition part_last update global indexes;

Now we can change the table to interval partioning:
alter table interval_sales set INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'));

Now we add some new data :
insert into interval_sales values (1,2,to_date('20071201', 'YYYYMMDD'),'d',3,4,9.9);
commit;


NAME         POSITION   NUM_ROWS HIGH_VALUE
---------- ---------- ---------- --------------------------------------------------------------------------------
P0                  1          1 TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P1                  2          1 TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P3                  3          1 TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
PART200701          4          1 TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P221            5          1 TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA


It has made a new partition for December 2007!

Now we add some more data to 2007:
insert into interval_sales values (1,2,to_date('20070801', 'YYYYMMDD'),'d',3,4,9.9);
commit;


NAME         POSITION   NUM_ROWS HIGH_VALUE
---------- ---------- ---------- --------------------------------------------------------------------------------
P0                  1          1 TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P1                  2          1 TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P3                  3          1 TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
PART200701          4          1 TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P241            5          1 TO_DATE(' 2007-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P221            6          1 TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA


Because the interval is one month, it has created new monthly partition also for new row.

But this was the problem I started thinking when I read Rittman Mead's blog post. What happens when you add new rows to old yearly partitions? The old yearly partitions have data inside that spans over whole year. Does the interval feature also create new monthly partition to old data? If it does, does it also move data from old yearly partition to new monthly partition? Lots of questions so let's try!

insert into interval_sales values (1,2,to_date('20060712', 'YYYYMMDD'),'d',3,4,9.9);
commit;


NAME         POSITION   NUM_ROWS HIGH_VALUE
---------- ---------- ---------- --------------------------------------------------------------------------------
P0                  1          1 TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P1                  2          1 TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P3                  3          1 TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
PART200701          4          1 TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P241            5          1 TO_DATE(' 2007-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P221            6          1 TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA


No, it does not create new partition. Ok. How does it know which partition was created manually and which with monthly interval? There's a new column 'interval' for table user_tab_partitions.

SELECT
   PARTITION_NAME "NAME",
   PARTITION_POSITION "POSITION",
   INTERVAL
FROM
   DBA_TAB_PARTITIONS
WHERE
   TABLE_NAME in ('INTERVAL_SALES')
ORDER BY
   TABLE_NAME, PARTITION_POSITION;
 

NAME   POSITION INTERVAL
---------- -------------- --------------
P0                           1 NO
P1                           2 NO
P3                           3 NO
PART200701          4 NO
SYS_P241              5 YES
SYS_P221              6 YES


So when partitioning is set to interval, it only splits new interval partitions, not the old manually created ones. 

Ok, let's get difficult.

insert into interval_sales values (1,2,to_date('20071224', 'YYYYMMDD'),'d',3,4,9.9);
commit;

Now we have to rows at December 2007, one in 1st day and one in 24th.

Now we change the partition interval to days:
alter table interval_sales set INTERVAL(NUMTODSINTERVAL(1, 'day')) ;

And add new row to 15th day:
insert into interval_sales values (1,2,to_date('20071215', 'YYYYMMDD'),'d',3,4,9.9);
commit;



NAME         POSITION   NUM_ROWS HIGH_VALUE
---------- ---------- ---------- --------------------------------------------------------------------------------
P0                  1          1 TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P1                  2          1 TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
P3                  3          2 TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
PART200701          4          1 TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P241            5          1 TO_DATE(' 2007-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P221            6          3 TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA


So it does not split it to daily partitions. Why not?
Because when we ran alter table interval, Oracle changes every partition to manually created:

NAME  POSITION INTERVAL
---------- ------------- ---
P0                         1 NO
P1                         2 NO
P3                         3 NO
PART200701        4 NO
SYS_P241            5 NO
SYS_P221            6 NO



I'm out of tricks, Oracle has thought of everything :)

Saturday, April 4, 2015

TekGear Twiddler 3 : one-hand chorded keyboard

Twiddler3 is a one-handed keyboard using bluetooth. Idea is you only need one hand to type and the keyboard is very tiny. Typing it is a bit like chording a neck of a guitar.


With Twiddler it takes some time to learn to type fast. I've only typed for a couple of days and I can type 6-8 words per minute. With regular keyboard I can type 34 WPM.


I made a cheat sheet for easier learning of the keys. The keys are arranged in four rows each containing three keys. Each of the four fingers only needs to press one key in a row. The key 'A' is then typed with the leftmost key of top row. If you want to type letter 'K' you press simultaneously the rightmost key of top row and leftmost key of bottom row.

Each key combination is configurable so you can make your own arrangements. What is even better, you can write syllables or even whole words also with a single key combination. There are 81 possible combinations of the basic keys and 26 alphabets in English language so there's some room for you own combinations. I for instance have to add Finnish 'äöå' somewhere. On top of Twiddler3 there's also a joystick that can be used as mouse.

Twiddler3, as the name implies, is not the first of its kind. Here's is a study of learning rates of the first Twiddler:
Expert Chording Text Entry on the Twiddler One–Handed Keyboard

I'm hoping I can use this outdoors, while walking or sitting in a bus.Sometimes it's difficult to write in a moving bus with a tablets touchscreen or notebooks keyboard. I'm quite sure it will be easier to type with Twiddler3.


Ok, this is why I bought Twiddler3. Writing a memo while hiking and enjoying a cup of coffee.
Who cares if the typing speed is a little slower. Who's in a hurry in a place like this?

Sunday, March 22, 2015

Tietokannan levyjärjestelmän kuormituksen vaikutus levyviiveisiin

Levyjärjestelmän kuormituksen ja viiveiden simulointi ei ole helppoa koska kyse on monimutkaisesta järjestelmästä missä on useammalla tasolla välimuisteja sekä resurssien jakoa.

Sain kuitenkin viimein tehtyä mielessäni olevan hyvin yksinkertaisen simuloinnin jossa simuloidaan suoraan erillisiin levyihin kohdistuvaa kuormaa ja etenkin sitä miten kuorman kasvaessa ajallisesti päällekkäiset lukupyynnöt vaikuttavat lukupyyntöjen viiveisiin. Levy on rajallinen resurssi ja yksinkertaisimmillaan jokainen lukupyyntö kestää keskimäärin nykylevyillä 5,5 millisekuntia. Nykyisillä levyillä on kuitenkin käytössä oma sisäinen "asynkroninen" jononsa kuten NCQ tai TCQ joka mahdollistaa levylukujen järjestäminen levyn sisällä niin että se voidaan tehdä pienimmällä mahdollisella lukupään liikkeellä. Kuitenkin keskimäärin voidaan vielä sanoa että nykyjärjestelmässä 5,5ms on hyvä hakuaika.

Johtuen tuossa hakuajasta levyllä on myös maksimi lukujen määrä sekunnissa mikä on 1s/5,5ms eli noin 180 IOPS.

Levyistä hyviä suorituskykytestejä löytyy täältä:
StorageReview.com Benchmark Database


SSD-levyjen hakuajat ovat tietenkin huomattavasti nopeammat joten niitä on tässä edes turha käsitellä.

Käytin oman levyio-simulaattorini tekoon kaikkein kehittyneintä työkalua eli Exceliä :)
Kun annan parametreiksi IOPS, levyjen määrän, testin keston sekunteina ja levyn keskimääräisen hakuajan, kaavani luo satunnaisluvulla tarvittaman määrän testihakuja. Kaava jakaa nämä jokaiselle levylle erikseen ja laskee päällekkäistä operaatioista aiheutuvan lisäviiveen. Kaavan maksimimäärä testihauille on tällä hetkellä 15000 ja teknisesti onnistuisi luultavasti ainakaan 64000 mutta se ei ole tarpeen koska huomattavasti pienemmälläkin määrällä saa simulaatiossa jo riittävän tarkkuuden.

Ajoin testit kymmenellä levyllä ja testien simuloidut kestot olivat 7-10 sekunnin välillä. Excel suoriutui niistä kohtuullisen nopeasti, kaavojen päivitys eli yhden testin ajo kesti n. 15 sekuntia neljällä prosessorilla.


Käyrässä pystyakseli on hakuaika millisekunneissa ja vaaka-akseli IOPS. Kymmenen levyn järjestelmässä 5,5ms hakuajalla 1800 IOPS on teoreettinen maksimi.


Kun tuo arvo ylitetään, vain nuo 1800 IOPS suoritetaan ja sen yli menevät pyynnöt jäävät jonoon joka kasvaa jatkuvasti. Johtuen simuloinnin lyhyydestä keskimääräinen hakuaika on vielä "järkevä" vaikka pitempään simuloitaessa levyjonon koko kasvaa jatkuvasti ja hakuaika on käytännössä ikuinen ts. järjestelmä on jumissa ja kyselyt keskeytyvät timeoutiin. 




Yllä olevassa kaaviossa on keskimääräinen hakuaika kuormituksen funktiona. Pystyakseli on logaritminen. Pienellä kuormalla 5,5ms hakuaika saavutetaan mutta kuorman kasvaessa rinnakkaisten hakupyyntöjen määrä kasvaa ja kun levyt ovat kuormittuneet n. 50% niin hakuaika on kasvanut jo 8,1 millisekuntiin. Kun hakuaika on jo 20 millisekuntia, niin levyjärjestelmä on jo kuormittunut 80%:iin. 

Todellisuus tietenkin on taas monimutkaisempi. NCQ ja TCQ-ominaisuudet levyissä alkavat toimia vasta kun levyillä on jo jonoja ts. ne tasaavat hakuajan nousua suuremmalla kuormalla. Samalla se tarkoittaa myös että levyllä ei jonoja ole jos hakuaika on lähellä minimiä.

Samoin olen tässä käsitellyt vain hajalukuja. Riippuen kannan kuormasta osa hauista on hajalukuja ja osa taulujen läpilukuja yms. missä haetaan suuri määrä peräkkäin tallennettua dataa ts. peräkkäislukuja joissa lukupään siirtymistä on vähemmän ja luku siksi tehokkaampaa.

Mielenkiintoinen näkökanta on myös kuinka paljon levyviiveet aiheuttavat käyttäjien työajan menetystä. Jos kaikki levyhaku on käyttäjien tekemää( mitä se harvoin on) niin voidaan laskea työajan menetykset kuorman kasvun ja niiden viiveiden kasvun myötä. Jos tiedetään käyttäjien tekemien hakujen osuus koko kuormasta, voidaan allaolevaa kaaviota myös arvioida sillä kertoimella.



Ajatuksena tuossa on että kun tunnin aikana tehdään tunnin ajan levyhakuja, vievät ne samalla käyttäjien työaikaa saman verran. Jos hakuaika tuplaantuu, viedään kahden hengen työaika. Levykuorma tietenkin vaihtelee päivän aikana, joten silloin verrataan keskimääräistä kuormitusta työaikana. Kun siis 10 levyn järjestelmää kuormitetaan 600 IOPSn verran, vie se normaalien levyviiveiden lisäksi yhden hengen työpanoksen johtuen rinnakkaisuudesta tulevista lisäviiveistä. Jos järjestelmä on kuormittunut 80%:iin niin rinnakkaisuuden viemä käyttäjäaika vastaa jo 16 käyttäjän työpanosta. Laskelmia levynkuormituksesta ja käyttäjäviiveistä kannattaakin käyttää tukena levyjärjestelmän tehotarpeita ja kustannuksia arvioitaessa

Samaa levykuormituksen arviointia voi käyttää myös esimerkiksi Hadoopin levyjen määrää suunniteltaessa.