Fou-Lu
08-28-2011, 08:36 PM
Unfortunately as your filesize increases, the probability of exhausting your memory will also increase. There is no real solution to this, but IMO to combat it you would need to use an fopen technique with a line skip and count back in a 100 entry buffer. What a pain.
If you can actually create this data file though, you could create a random access file instead and use seek. Since you only have the date and a server load, you can do that with a single integer and a single float and parse out the data to display as you see fit. The pro to this is that you now know each record is 64 bits in size, and you can use fseek in combination with 100x the 8bytes, and count backwards.
So, if I converted these into an strtotime and added a float for the load, I'd end up with a dat file like this (no header, so you may want to consider adding that in).
#
N @;?
N33@LM
Nף@[[
N\@oi
N @|w
NR@
N)\@
N@˽
N̄@
N)\@
N33@,NffV@_.NRn@[<NQ@fNR@tN@̞N@۬NQ@N@N\@;NH@LNzT@{9NHz@cN
C@qNH:@N\B@܍NH@
N33C@%Nfff@+Nk@LN{@`NG@N@,N\@<Nף@KN <A`Nq=&AjNH*A{Nz,A Nq=AN @%Np@3N@AN@ONz@]N@kNp@zN@NQ@+N( A;N
ALNQ@\Nz@kN@{N{@N{ANR@N@N\A"NcA0NaA>N ALNA[N(AiN@+wN)\@;N @LN5@[NG@pN@|Nq=@NH@Nl@N{@N@N ANzAN8A-N@<N(AJN@+XN@<fN{>AKtN=
KAZNMAkN
#A|NQ(ANffBAN@N@NANQANq=JA NQXAN)\ANH@+NA+9NG@;GN(AKUN A\cN AkqNA{N=
@N!@N
@NG?N?NQX@NףP@NzT@Nff@Nq=ANq=@,N33@=(Nz@L6N@[DNffv@lRN @`N@nN@|N @N=
'@NE@̦N33#@ܴNX@NH@N\2@N(@N1@,N@< N
@LNR@\%NG@l3N(L@|AN @ON3sWCNfff?!N?.N)\??N?LNq=?\NR@kNq=?|"NG?0Nz$@>N?LNף?ZN ?hN?vN?NQ?N=
?Nף?N?+NI@>N
C@LNp]@[N\R@nN@|Nq=?N@Nq=?-NQ@;Nz?INH
@WN=
@eNQ?sN ?N?N
?,N\?;NQ?LNף?]N?kNq=?|Nff?Nff? N?Nff@NR@*NR~@8N @@FN5@TN@cNq=Z@qN@-NR@<N33#@MNzD@\N@lN=
@}N)\@N(?N?NGa@NG@N33@NH@'N)\@5NQ@DNH@RNz@-`NRNA<nNq=A`N{@nNz@|N@N@NRn@NA@NE@N@NffF@N{@NHZ@%N 8@3N(@,AN*@<ONGa@]kNRn@myN(@N)\@N{^@NQ@N@Nz@N̔@N@N@Nq=@Np@,"Nףp@<0Nz@M>Nw@]LNq=Z@lZN@|hNףP@vNq=@N+@*NE@*N@ͮNp@ܼNq@N @N @
N
@N=
g@,N@>N@LN=
@]-NQ@n;Np@{IN{@eN@sN\@N1@̏NffF@ܝNU@N{>@N=
'@
NH@N=
'@,N!@=N@K N=
@]NRAmN#A|*N½@8N@FN *@TNz@bNz@pNk@~NR@N@NffV@Nµ@N[@/N(\@<N@LN=
@]N@mNp]@|N@N(@'Nq=J@5Np@CN{@QN(@_N@mNR@{N
C@N@N{~@,NR@<Nq=@LNR@]N@sNף*@N)\@Nu@ N{>@ N@$ Np}@2 N{~@@ N{>@N N{@
k N\b@y N=
'@, N)\?@< NQ@L N@] Nz?l N)@| NA@ N=
w@ N%@ N(l@!NR~@!N33@!!N @/!N@=!NG1@L!Nq=Z@Z!N @,h!NQ*@<v!NR^@N!NR.@]!Nz@l*!NH?|!N?!Nz?!Nff?!NH
@!N@!N?"N\@"N@"NR?-"NG@;"NQ@,I"N33S@<W"Nף@@Le"N33C@_s"N=
g@m"NQ8@}"N B"Np@"N{@"N9@"N=
'@"NG!@"N33@"NffV@
#Nף@#N@+*#N{A<8#Nff@LF#NRNA\T#NQAlb#N33A|p#NR6A~#NA#N(@#NQ8@#N\B@ζ#NL@#N@#NH@#N\ @-$N)\@<$N@M'$Nq=@]5$N\@mC$Nz@|Q$Np@_$N@*m$NA{$N)\@$N A̗$NRAݥ$N A$N@$NRA
$Nף0A$N@+$N(@<$Nף@L%Np@^%N@m$%N)\@|2%N33@@%N@N%N\A\%NAj%Nq=@x%N@݆%NQA%N@%N@%N@%N@+%N@=%N\@L%N\@]%Nz@l&N\@|&N\@!&N=
A/&N@=&NQ@K&N{AY&NAg&N@u&N@&NףA&N33@*&NA,&NR@B&NpAR&N@c&N=
@p&Np@&NH@'N=
@'N=
@'Np A,'N@:'N@H'N@V'Nz@d'N=
@s'NH@'N=
@,'N{@<'NpAL'NR@^'NG@m'Nff@|'N@'Nff@'N=
@*'N\@
(N{~@(N{@)(N\@7(N33@E(Nף`@T(N?b(NHj@+p(N@<~(NAL(N)\A^(N
KAl(N1A|(NA(NmA(NA*(NH@(N@(N33@
)N)\@)Nff@&)N=
@5)NQ@C)Ny@,Q)N@<_)N=
@Lm)N\@]{)NHj@m)N[@|)N33s@)N33@)N@)N@)Nq=Z@)NRA)NA)NY@*N
׃@*Nz@$*N=
@,2*N @<@*Nq=@KN*Nz@\\*N @lj*N @|x*NR@*NG@*N=
W@*NH@*N @̾*NQH@*N)\?@*N=
W@*NG@*N @+N)\_@++NRN@<!+N(,@K/+NE@^=+NjBlK+N\@{Y+N@+NH@+N{@˟+NA*+N(@+N'A+N33A+Nz@+N33@-+N{@<,N{@\,N*@l,,N@|:,NAAH,N̪AV,NR@d,N33@r,N\
À,N@,N@,N(@,NG#B
,NQB,Nף$A,,N A<,N33AL,N
A\,NAl
-NA-NQA)-N)\@7-N@E-NAS-NAa-N{Ao-N@}-N̤@-NG@-Nq=@-N@,-NA<-N
AL-NR@b-N A|-NHA
.N,A{.N=
@.NHJA-.NA<.NAAM.NA\.NAm.NQA|.N
@.N@.N
s@/NH@/N@#/NQ@1/N
A?/N(@M/N=
A\/Nq=:Aj/Nff"A.x/Nu@</NGq@L/Nף@\/NQ@l/Nq=@|/N=
@/NR@/NH@/N¥@/N{@0Nף@0N)\o@ 0N@.0N@=0N@K0Npm@,Y0N@<g0N\FAMu0NA\0NAl0N{@|0N0A*0N(A1Nz@,1Nq@,:1N@<H1N{~@KV1N<@\d1NG1@lr1Np-@{1NR.@1Nff?1NR@1N{@1N @1NH@1NX@1NHz@
1NH@
2NQ@,2N)\@<)2N\r@M72Nף@_E2N@lS2NE@|a2N
3@*2N9@2N@̧2Nq=@ݵ2NG@2NzD@2NE@2NX@2NA,2Nz@<
3N{.@L3NG@d&3Nz4@p43Nף?|B3N33@P3NQ@l3Nff@z3N@̈3N `@ޖ3N=
G@3Np@3N
׃@3N(|@3NzT@-3N{^@<3NzD@L3N*@]4NQ8@l4N=
G@|#4N=
'@14NR??4NR@M4N%@[4N=
@i4NG?w4N?4N@4N{@4NY@74N\B@,4N)\_@<4NGa@L4NRN@b4Np@l4N
c@{5Np@5NH@ 5NG@.5N@<5N)\_@J5Nף@X5N{^@f5N;@t5N@5N{N@5NRN@,5N{~@[5NH@]5Np@o5N{~@|5N=
3A
And read with:
<?php
$sPath = './newseek.dat';
$iToRecord = 100;
$iRecordSize = 8;
date_default_timezone_set('UTC');
print '<ol>';
if ($fh = fopen($sPath, 'r'))
{
fseek($fh, -($iToRecord * $iRecordSize), SEEK_END);
while ($sRecord = fread($fh, $iRecordSize))
{
$aUnpacked = unpack('idate/fload', $sRecord);
$iTime = $aUnpacked['date'];
$fLoad = $aUnpacked['load'];
printf('<li class="%s">%s | Server Load:*%0.2f</li>' . PHP_EOL, date('D', $iTime), date('D jS M, h:i:s a', $iTime), $fLoad);
}
}
print '</ol>';
?>
Results in:
<ol><li class="Wed">Wed 27th Jul, 08:30:04 am | Server Load:*4.96</li>
<li class="Wed">Wed 27th Jul, 09:30:04 am | Server Load:*5.34</li>
<li class="Wed">Wed 27th Jul, 10:30:04 am | Server Load:*5.18</li>
<li class="Wed">Wed 27th Jul, 11:30:06 am | Server Load:*5.69</li>
<li class="Wed">Wed 27th Jul, 12:30:04 pm | Server Load:*4.02</li>
<li class="Wed">Wed 27th Jul, 01:30:05 pm | Server Load:*3.74</li>
<li class="Wed">Wed 27th Jul, 02:30:04 pm | Server Load:*4.31</li>
<li class="Wed">Wed 27th Jul, 03:30:04 pm | Server Load:*4.53</li>
<li class="Wed">Wed 27th Jul, 04:30:04 pm | Server Load:*6.93</li>
<li class="Wed">Wed 27th Jul, 05:30:04 pm | Server Load:*3.71</li>
<li class="Wed">Wed 27th Jul, 06:30:04 pm | Server Load:*7.43</li>
<li class="Wed">Wed 27th Jul, 07:30:04 pm | Server Load:*12.41</li>
<li class="Wed">Wed 27th Jul, 08:30:05 pm | Server Load:*8.31</li>
<li class="Wed">Wed 27th Jul, 09:30:04 pm | Server Load:*9.87</li>
<li class="Wed">Wed 27th Jul, 10:30:04 pm | Server Load:*7.69</li>
<li class="Wed">Wed 27th Jul, 11:30:04 pm | Server Load:*11.05</li>
<li class="Thu">Thu 28th Jul, 12:30:04 am | Server Load:*25.52</li>
<li class="Thu">Thu 28th Jul, 08:30:04 am | Server Load:*2.07</li>
<li class="Thu">Thu 28th Jul, 09:30:05 am | Server Load:*3.78</li>
<li class="Thu">Thu 28th Jul, 10:30:04 am | Server Load:*4.30</li>
<li class="Thu">Thu 28th Jul, 11:30:04 am | Server Load:*3.97</li>
<li class="Thu">Thu 28th Jul, 12:30:03 pm | Server Load:*2.95</li>
<li class="Thu">Thu 28th Jul, 01:30:04 pm | Server Load:*2.77</li>
<li class="Thu">Thu 28th Jul, 02:30:04 pm | Server Load:*2.71</li>
<li class="Thu">Thu 28th Jul, 03:30:03 pm | Server Load:*2.73</li>
<li class="Thu">Thu 28th Jul, 04:30:04 pm | Server Load:*1.80</li>
<li class="Thu">Thu 28th Jul, 05:30:04 pm | Server Load:*2.23</li>
<li class="Thu">Thu 28th Jul, 06:30:04 pm | Server Load:*4.94</li>
<li class="Thu">Thu 28th Jul, 07:30:05 pm | Server Load:*5.75</li>
<li class="Thu">Thu 28th Jul, 09:30:04 pm | Server Load:*7.84</li>
<li class="Thu">Thu 28th Jul, 10:30:05 pm | Server Load:*3.39</li>
<li class="Thu">Thu 28th Jul, 11:30:04 pm | Server Load:*3.92</li>
<li class="Fri">Fri 29th Jul, 12:30:05 am | Server Load:*4.59</li>
<li class="Fri">Fri 29th Jul, 01:30:05 am | Server Load:*2.38</li>
<li class="Fri">Fri 29th Jul, 02:30:04 am | Server Load:*2.49</li>
<li class="Fri">Fri 29th Jul, 03:30:04 am | Server Load:*3.79</li>
<li class="Fri">Fri 29th Jul, 04:30:05 am | Server Load:*4.52</li>
<li class="Fri">Fri 29th Jul, 05:30:07 am | Server Load:*4.49</li>
<li class="Fri">Fri 29th Jul, 06:30:04 am | Server Load:*3.08</li>
<li class="Fri">Fri 29th Jul, 07:30:04 am | Server Load:*2.81</li>
<li class="Fri">Fri 29th Jul, 10:30:05 am | Server Load:*2.90</li>
<li class="Fri">Fri 29th Jul, 11:30:05 am | Server Load:*2.39</li>
<li class="Fri">Fri 29th Jul, 12:30:04 pm | Server Load:*5.57</li>
<li class="Fri">Fri 29th Jul, 01:30:05 pm | Server Load:*4.04</li>
<li class="Fri">Fri 29th Jul, 02:30:04 pm | Server Load:*3.07</li>
<li class="Fri">Fri 29th Jul, 03:30:05 pm | Server Load:*3.08</li>
<li class="Fri">Fri 29th Jul, 04:30:12 pm | Server Load:*3.39</li>
<li class="Fri">Fri 29th Jul, 05:30:07 pm | Server Load:*8.80</li>
<li class="Fri">Fri 29th Jul, 06:30:04 pm | Server Load:*7.14</li>
<li class="Fri">Fri 29th Jul, 07:30:04 pm | Server Load:*2.72</li>
<li class="Fri">Fri 29th Jul, 08:30:04 pm | Server Load:*2.02</li>
<li class="Fri">Fri 29th Jul, 09:30:12 pm | Server Load:*2.82</li>
<li class="Fri">Fri 29th Jul, 10:30:08 pm | Server Load:*1.88</li>
<li class="Fri">Fri 29th Jul, 11:30:04 pm | Server Load:*2.05</li>
<li class="Sat">Sat 30th Jul, 12:30:04 am | Server Load:*2.38</li>
<li class="Sat">Sat 30th Jul, 02:30:04 am | Server Load:*4.20</li>
<li class="Sat">Sat 30th Jul, 03:30:04 am | Server Load:*6.55</li>
<li class="Sat">Sat 30th Jul, 04:30:04 am | Server Load:*3.50</li>
<li class="Sat">Sat 30th Jul, 05:30:06 am | Server Load:*3.11</li>
<li class="Sat">Sat 30th Jul, 06:30:04 am | Server Load:*5.17</li>
<li class="Sat">Sat 30th Jul, 07:30:04 am | Server Load:*4.12</li>
<li class="Sat">Sat 30th Jul, 08:30:04 am | Server Load:*3.94</li>
<li class="Sat">Sat 30th Jul, 09:30:05 am | Server Load:*3.32</li>
<li class="Sat">Sat 30th Jul, 10:30:05 am | Server Load:*3.47</li>
<li class="Sat">Sat 30th Jul, 11:30:04 am | Server Load:*3.07</li>
<li class="Sat">Sat 30th Jul, 12:30:04 pm | Server Load:*5.41</li>
<li class="Sat">Sat 30th Jul, 01:30:05 pm | Server Load:*2.88</li>
<li class="Sat">Sat 30th Jul, 02:30:04 pm | Server Load:*3.11</li>
<li class="Sat">Sat 30th Jul, 03:30:04 pm | Server Load:*2.61</li>
<li class="Sat">Sat 30th Jul, 04:30:07 pm | Server Load:*1.99</li>
<li class="Sat">Sat 30th Jul, 05:30:06 pm | Server Load:*2.48</li>
<li class="Sat">Sat 30th Jul, 06:30:04 pm | Server Load:*2.59</li>
<li class="Sat">Sat 30th Jul, 07:30:05 pm | Server Load:*2.11</li>
<li class="Sat">Sat 30th Jul, 08:30:05 pm | Server Load:*1.76</li>
<li class="Sat">Sat 30th Jul, 09:30:04 pm | Server Load:*1.81</li>
<li class="Sat">Sat 30th Jul, 10:30:04 pm | Server Load:*2.34</li>
<li class="Sat">Sat 30th Jul, 11:30:04 pm | Server Load:*2.22</li>
<li class="Sun">Sun 31st Jul, 12:30:04 am | Server Load:*3.40</li>
<li class="Sun">Sun 31st Jul, 01:30:31 am | Server Load:*3.04</li>
<li class="Sun">Sun 31st Jul, 02:30:04 am | Server Load:*3.49</li>
<li class="Sun">Sun 31st Jul, 03:30:04 am | Server Load:*3.52</li>
<li class="Sun">Sun 31st Jul, 04:30:04 am | Server Load:*3.23</li>
<li class="Sun">Sun 31st Jul, 05:30:10 am | Server Load:*2.46</li>
<li class="Sun">Sun 31st Jul, 06:30:04 am | Server Load:*3.56</li>
<li class="Sun">Sun 31st Jul, 07:30:03 am | Server Load:*4.17</li>
<li class="Sun">Sun 31st Jul, 08:30:04 am | Server Load:*4.59</li>
<li class="Sun">Sun 31st Jul, 09:30:04 am | Server Load:*4.29</li>
<li class="Sun">Sun 31st Jul, 10:30:04 am | Server Load:*4.11</li>
<li class="Sun">Sun 31st Jul, 11:30:04 am | Server Load:*3.49</li>
<li class="Sun">Sun 31st Jul, 12:30:04 pm | Server Load:*4.77</li>
<li class="Sun">Sun 31st Jul, 01:30:04 pm | Server Load:*3.47</li>
<li class="Sun">Sun 31st Jul, 02:30:03 pm | Server Load:*2.93</li>
<li class="Sun">Sun 31st Jul, 03:30:04 pm | Server Load:*2.28</li>
<li class="Sun">Sun 31st Jul, 04:30:04 pm | Server Load:*3.22</li>
<li class="Sun">Sun 31st Jul, 05:30:05 pm | Server Load:*3.23</li>
<li class="Sun">Sun 31st Jul, 06:30:04 pm | Server Load:*3.97</li>
<li class="Sun">Sun 31st Jul, 08:30:19 pm | Server Load:*5.09</li>
<li class="Sun">Sun 31st Jul, 09:30:05 pm | Server Load:*4.92</li>
<li class="Sun">Sun 31st Jul, 10:30:07 pm | Server Load:*3.97</li>
<li class="Sun">Sun 31st Jul, 11:30:04 pm | Server Load:*11.19</li>
</ol>
Nice. I don't know whether it was the c&p or if it was the forums here, but there is no linefeeds between these.
One other benefit is that the packed file is 6kb versus the original @ 49kb.
I love random access files.