code sprint round1]..을 하다가 중간까지밖에 못간 기록..  ㄴ php

1)
code sprint round 1 ..을 보고 만들어보자는 생각을 하다가
말 그대로, 중간까지밖에 못해봤습니다.

뭐, 여러가지 이유가 있긴 했죠.
파일 크기가 너무 컸다든지 (php 의 기본 처리용량은 2Gbyte 까지입니다..)
중간에 PC가 멈췄(응?)다든지..

.. 뭐, 그런 속사정은 넘어가더라도,
기록은 남겨놔야 맛이니까요..

*참고*
code Sprint Round 1 - SK planet..
http://codesprint.kr/participation/round1_intro.htm 

code Sprint (facebook)
http://www.facebook.com/SKplanetCodeSprint 

*주의*
php 코드를 해석하지 못하거나
코드의 의도를 모르거나
문제의 원본 소스가 없으면

실행해도 별다른 성과를 얻지 못할 내용들입니다.

...

2)

-- bigValue.php --

내용 모두 읽어서
가장 큰 값이 뭔지를 확인한다는 내용입니다.
start,end,distance 형식이었거든요..

data 의 기본형을 알아두면,
나중에 어떻게 조직을 맞춰야할 지 가늠할 수 있을 것 같아서요..


<?
function readBig($filename) {
$minfrom=0;
$minto=0;
$mindistance=0;
$fs=filesize($filename);
  $f=fopen($filename, 'r');
$lp=0;
$np=0;

$divv=100;
$pzo=intval($fs/$divv);
// echo $pzo."*$divv<br/><br/>";
echo '<div style="width:100px; height:18px; overflow:hidden; position:relative;">';

//  while(($np=ftell($f))<$fs) {
  while(!feof($f)) {

    $v=fscanf($f, '%d,%d,%d');
    if ($v[0]<0) continue;
    if ($v[0]>$minfrom) $minfrom=$v[0];
    if ($v[1]>$minto) $minto=$v[1];
    if ($v[2]>$mindistance) $mindistance=$v[2];

    if ($np-$lp>$pzo) {
      echo '<div style="width:100px; height:18px; overflow:hidden; position:absolute; background-color:white; left:0px; top:0px;">'. sprintf('%2.2f', $np/$fs*100). '%..<br/></div>';
      $lp=$np;
      }

$np=ftell($f);
//break;

    } 
  fclose($f);
  echo '<div style="width:100px; height:18px; overflow:hidden; position:absolute; background-color:white; left:0px; top:0px;">complete..</div>';

  echo '</div><br/><br/>';

  echo 'maximum : '.$minfrom.','.$minto.','.$mindistance;
  echo '<br/>last : '.$v[0].','.$v[1].','.$v[2];
  echo '<br/>last pointer : '.$np;
  echo '<br/>file size : '.$fs;
  }

readBig('./input.txt');

--
by ftell

maximum : 204536,999999,42921
last : 204536,204947,184
last pointer : 203963698
--

--
by feof

maximum : 999999,999999,47397
last : ,,
last pointer : 2039636979
file size : 2039636979
--

--
원본 파일 총량 : 대략 10G
file당 단위크기 : 대략 10M 단위
file 갯수 추청 : 1000개
file당 from 사용기준 : 1000개
index : 필요한 것으로 추정
--

?>



...

3)

-- bigSplit.php --

파일 크기가 너무 커서, ( 원본파일 하나의 크기가 2Gbyte 를 넘었죠..)
최대한(?) 잘라놓기로 결정하고 실행한 내용입니다.

일단 잘라놓으니 보기좋(?)더라구요.


<?
function readBig($filename, $outdir) {
$minfrom=0;
$minto=0;
$mindistance=0;
$fs=filesize($filename);
  $f=fopen($filename, 'r');
$lp=0;
$np=0;

$divv=100;
$pzo=intval($fs/$divv);

echo '<div style="width:100px; height:18px; overflow:hidden; position:relative;">';

$lastW=-1;
 $divW=1000;

  while(!feof($f)) {

    $v=fscanf($f, '%d,%d,%d');

    $nowW=intval($v[0]/$divW);

//by stoped server.. so continue from number..
// if ($nowW<327) continue;
// if ($nowW<579) continue;
// if ($nowW<776) continue;
if ($nowW<924) continue;
//

    if ($nowW!=$lastW) {
      if ($lastW>=0) fclose($nowFp);
      $nowF=$outdir.$nowW.'.txt';
      $nowFp=fopen($nowF, 'w');
      $lastW=$nowW;
      }

    fprintf($nowFp, "%d,%d,%d\r\n", $v[0], $v[1], $v[2]);

    if ($np-$lp>$pzo) {
      echo '<div style="width:100px; height:18px; overflow:hidden; position:absolute; background-color:white; left:0px; top:0px;">'. sprintf('%2.2f', $np/$fs*100). '%..<br/></div>';
      $lp=$np;
      }

  $np=ftell($f);
//  if ($nowW>1) break;

    } 

  if ($nowFp) fclose($nowFp);

  fclose($f);
  echo '<div style="width:100px; height:18px; overflow:hidden; position:absolute; background-color:white; left:0px; top:0px;">complete..</div>';

  echo '</div><br/><br/>';

  echo '<br/>last : '.$v[0].','.$v[1].','.$v[2];
  echo '<br/>last pointer : '.$np;
  echo '<br/>file size : '.$fs;
  }

readBig('./input.txt', './inputsplit/from_');

--
by feof

maximum : 999999,999999,47397
last : ,,
last pointer : 2039636979
file size : 2039636979
--

--
원본 파일 총량 : 대략 10G
file당 단위크기 : 대략 10M 단위
file 갯수 추청 : 1000개
file당 from 사용기준 : 1000개
index : 필요한 것으로 추정
--

?>



...

4)

-- compress.php --

잘라놓는 것 까지는 좋았는데,
PC에 남는 용량이 얼마 없어서요,
코드 길이를 최대한 절약해보기로 했습니다.
숫자를 numericAlphabet 화 하기로 한거죠.

.. 물론, 쓸만한 곳에만 썼을 거라 기억하고 있습니다.


<div style=font-family:굴림체;>
<?
// echo phpinfo();

//$readfile='./input_.txt';
 $readfile='./from_{fromPu}.txt'; // {fromPu} : fromPointer's upper value
 $writefile='./from_{fromPu}c.txt'; // {fromPu} : fromPointer's upper value

function replaceAll() { // original string, find string, replace string, ..
  static $args, $argl, $ov, $i;

  $args=func_get_args();
  $argl=count($args);
  $ov=$args[0];

  for ($i=1; $i<$argl; $i+=2) {
    $ov=str_replace($args[$i], $args[$i+1], $ov);
    }

  return $ov;
  }

//if (!($fromP=$_REQUEST['fromP'])) $fromP=0;
//if (!($toP=$_REQUEST['toP'])) $toP=0;
if (!($fromPu=$_REQUEST['fromPu'])) $fromPu=0;
if (!($fromPuLen=$_REQUEST['fromPuLen'])) $fromPuLen=1;
$lfromPuLen=$fromPuLen;

// echo replaceAll('{fromP}~{toP}', '{fromP}', $fromP, '{toP}', $toP);

function numK($v) { // for just <1000 numeric's string
  static $numericV='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', $vd;

  $vd=$v%62;

  return $numericV[($v-$vd)/62].$numericV[$vd];
  }

function numM($v) { // divided by 1K's double

  return numK((int)($v/1000)).numK($v%1000);
  }

function denumK($v) {
//  static $vv;
  static $i, $ov=0, $oA, $oa;

  $oA=ord('A');
  $oa=ord('a');

//  $vv[0]=$v[0]; $vv[1]=$v[1];
  $ov=0;
  for ($i=0; $i<2; $i++) {
//    if ($vv[$i]<='9') $ov=(int)$vv[$i]+$ov*62;
//    else if ($vv[$i]<='Z') $ov=ord($vv[$i])-$oA+10+$ov*62;
//    else $ov=ord($vv[$i])-$oa+36+$ov*62;
    if ($v[$i]<='9') $ov=(int)$v[$i]+$ov*62; // 0~9
    else if ($v[$i]<='Z') $ov=ord($v[$i])-$oA+10+$ov*62; // A-Z
    else $ov=ord($v[$i])-$oa+36+$ov*62; // a-z
    }

  return $ov;
  }

function denumM($v) {

  return denumK($v[0].$v[1])*1000+denumK($v[2].$v[3]);
  }

//

function numT($v) { // for just <1000 numeric's string
  static $numericV='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', $vd, $ov, $con, $nocon;
//  static $i;

//  $i=0;

  $ov='';
  $nocon=31;
  $con=62-$nocon;

  while($v>$nocon) {
    if ($v<$nocon) break;
    $vd=$v%$con;
    $ov.=$numericV[$vd+$nocon];
    $v=(($v-$vd)/$con);
//  echo '/'.$con.':'.$v.'/';
    $nocon=(int)(($nocon-1)>>1)+1;
    $con=62-$nocon;
// $i++; if ($i>100) break;
    }
  $ov.=$numericV[$v];

  return $ov;
  }

function denumT($v) {
  static $i, $ov, $oA, $oa, $vl, $vd, $vm;

  $oA=ord('A');
  $oa=ord('a');
  $vl=strlen($v);

  $nocon=31;
  $con=62-$nocon;

  $ov=0;
  $vd=0;
  $vm=1;

  for ($i=0; $i<$vl; $i++) {
    if ($v[$i]<='9') $vd=(int)$v[$i];
    else if ($v[$i]<='Z') $vd=ord($v[$i])-$oA+10;
    else $vd=ord($v[$i])-$oa+36;

//echo $ov.':'.$vm.'/'.$vd.'/'.$nocon.'<br/>';
    if ($vd<$nocon) break;

    $ov+=$vm*($vd-$nocon);
//echo $ov.':'.$vm.'/'.$vd.'/'.$nocon.'<br/>';
    $vm*=$con;

    $nocon=(int)(($nocon-1)>>1)+1;
    $con=62-$nocon;

    }
  $ov+=$vm*$vd;

  return $ov;
  }


//

function numKAll() {
  static $args, $argl, $ov, $i;

  $args=func_get_args();
  $argl=count($args);

  $ov='';
  for ($i=0; $i<$argl; $i++) {
    $ov.=numK($args[$i]);
    }

  return $ov;
  }

-- // for read.. prototype (before compress)
function readV($readfile, $fromPu, $fromPl, $toPu) { // readfile, 999,999, 999
  static $ov;
  static $fromP, $toPs, $toPe, $f, $v, $i, $fromPv, $toPv, $distv;
  $fromP=$fromPu*1000+$fromPl;
  $toPs=$toPu*1000;
  $toPe=$toPs+1000;

//  echo $readfile;
//  echo replaceAll($readfile, '{fromPu}', $fromPu);
  $f=fopen(replaceAll($readfile, '{fromPu}', $fromPu), 'r');
  if (!$f) return NULL;

  $i=0;

  while (!feof($f)) {
    $v=fscanf($f, '%d,%d,%d');
    if (!$v) continue;
    list($fromPv, $toPv, $distv)=$v;
    if ($fromPv!=$fromP) continue;
    if ($toPs>$toPv) continue;
    if ($toPe<=$toPv) continue;
    $ov[$i]=$v;
echo numK($toPv-$toPs).numT($distv).'<br/>';
//echo (($toPv-$toPs)*1000+$distv).'<br/>';
echo numM(($toPv-$toPs)*1000+$distv).'<br/>';
//echo denumM(numM(($toPv-$toPs)*1000+$distv)).'<br/>';
//echo $fromPv.','.$toPv.','.$distv.'<br/>';
//echo $i.' : '.$fromPv.' ~ '.$toPv.' = '.$distv.'<br/>';
//echo denumK(numK($i)).' : '.denumK(numK($fromPv)).' ~ '.denumK(numK($toPv-$toPs)).' = '.denumT(numT($distv)).'<br/>';
    $i++;
    }
  fclose($f);

//  var_dump($ov);
  }
--

// readV($readfile, 0, 0, 0);

function compressV($readfile, $writefile, $fromPu) {
  static $v, $fromPv, $toPu, $toPl, $distv, $f, $lfromP, $ltoPu, $g;

// static $i;
// $i=0;

  $f=fopen(replaceAll($readfile, '{fromPu}', $fromPu), 'r');
  if (!$f) return;
  $g=fopen(replaceAll($writefile, '{fromPu}', $fromPu), 'w');
  if (!$g) return;

  $lfromP=-1; $ltoPu=-1;
  while (!feof($f)) {
    $v=fscanf($f, '%d,%d,%d');
    if (!$v) continue;
    list($fromPv, $toPv, $distv)=$v;
    $toPu=(int)($toPv/1000);
    if (($lfromP!=$fromPv)||($ltoPu!=$toPu)) {
//      echo replaceAll('#{fromP}{toPu}<br/>', '{fromP}', numM($fromPv), '{toPu}', numK($toPu));
      fprintf($g, replaceAll("#{fromP}{toPu}\r\n", '{fromP}', numM($fromPv), '{toPu}', numK($toPu)) );
      $lfromP=$fromPv; $ltoPu=$toPu;
      }
    $toPl=$toPv%1000;
//    echo replaceAll('{toPl}{dist}<br/>', '{toPl}', numK($toPl), '{dist}', numT($distv));
    fprintf($g, replaceAll("{toPl}{dist}\r\n", '{toPl}', numK($toPl), '{dist}', numT($distv)) );
//    echo replaceAll('{a},{b},{c}<br/>', '{a}', $fromPv, '{b}', $toPv, '{c}', $distv);

// $i++; if ($i>1000) break;
    }

  fclose($g);
  fclose($f);
  }

for (; $fromPuLen>0; $fromPuLen--) {

echo 'compress started.. fromPu='.$fromPu.'<br/>';
compressV($readfile, $writefile, $fromPu); // readfileform, fromPu
echo 'compress finished..<br/>';

$fromPu++;

}

$fromPuLen=$lfromPuLen;
if ($fromPu<999) echo replaceAll('<a href=compressV.php?fromPu={fromPu}&fromPuLen={fromPuLen} target=_self>next : fromPu={fromPu}..</a>', '{fromPu}', $fromPu, '{fromPu}', $fromPu, '{fromPuLen}', $fromPuLen);

//echo numT(47397999999).'<br/>';
//echo denumT(numT(62)).'<br/>';
//echo strlen('finished<br/>');
?>
</div>



...

5)

곰곰히 생각해보니, 위치값을 찾는데까지
매번 순차검색을 전체 기준으로 시행할 것 같아서,
index 만들자..까지 생각해본거죠.

random 이 가능하도록..까지는 아니지만,
.. 아끼면 가능할 것 같아서 일단 만들어만 봤습니다.

-- makeindex.php --


<div style=font-family:굴림체;>
<?
// echo phpinfo();

 $readfile='./from_{fromPu}c.txt'; // {fromPu} : fromPointer's upper value
 $writefile='./fromindex_{fromPu}c.txt'; // {fromPu} : fromPointer's upper value

function replaceAll() { // original string, find string, replace string, ..
  static $args, $argl, $ov, $i;

  $args=func_get_args();
  $argl=count($args);
  $ov=$args[0];

  for ($i=1; $i<$argl; $i+=2) {
    $ov=str_replace($args[$i], $args[$i+1], $ov);
    }

  return $ov;
  }

if (!($fromPu=$_REQUEST['fromPu'])) $fromPu=0;
if (!($fromPuLen=$_REQUEST['fromPuLen'])) $fromPuLen=1;
$lfromPuLen=$fromPuLen;

// echo replaceAll('{fromP}~{toP}', '{fromP}', $fromP, '{toP}', $toP);

function numK($v) { // for just <1000 numeric's string
  static $numericV='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', $vd;

  $vd=$v%62;

  return $numericV[($v-$vd)/62].$numericV[$vd];
  }

function numM($v) { // divided by 1K's double

  return numK((int)($v/1000)).numK($v%1000);
  }

function denumK($v) {
  static $i, $ov=0, $oA, $oa;

  $oA=ord('A');
  $oa=ord('a');

  $ov=0;
  for ($i=0; $i<2; $i++) {
    if ($v[$i]<='9') $ov=(int)$v[$i]+$ov*62; // 0~9
    else if ($v[$i]<='Z') $ov=ord($v[$i])-$oA+10+$ov*62; // A-Z
    else $ov=ord($v[$i])-$oa+36+$ov*62; // a-z
    }

  return $ov;
  }

function denumM($v) {

  return denumK($v[0].$v[1])*1000+denumK($v[2].$v[3]);
  }

//

function numT($v) { // for just <1000 numeric's string
  static $numericV='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', $vd, $ov, $con, $nocon;

  $ov='';
  $nocon=31;
  $con=62-$nocon;

  while($v>$nocon) {
    if ($v<$nocon) break;
    $vd=$v%$con;
    $ov.=$numericV[$vd+$nocon];
    $v=(($v-$vd)/$con);

    $nocon=(int)(($nocon-1)>>1)+1;
    $con=62-$nocon;

    }
  $ov.=$numericV[$v];

  return $ov;
  }

function denumT($v) {
  static $i, $ov, $oA, $oa, $vl, $vd, $vm;

  $oA=ord('A');
  $oa=ord('a');
  $vl=strlen($v);

  $nocon=31;
  $con=62-$nocon;

  $ov=0;
  $vd=0;
  $vm=1;

  for ($i=0; $i<$vl; $i++) {
    if ($v[$i]<='9') $vd=(int)$v[$i];
    else if ($v[$i]<='Z') $vd=ord($v[$i])-$oA+10;
    else $vd=ord($v[$i])-$oa+36;

    if ($vd<$nocon) break;

    $ov+=$vm*($vd-$nocon);
    $vm*=$con;

    $nocon=(int)(($nocon-1)>>1)+1;
    $con=62-$nocon;

    }
  $ov+=$vm*$vd;

  return $ov;
  }


//

function numKAll() {
  static $args, $argl, $ov, $i;

  $args=func_get_args();
  $argl=count($args);

  $ov='';
  for ($i=0; $i<$argl; $i++) {
    $ov.=numK($args[$i]);
    }

  return $ov;
  }

function makeindex($readfile, $writefile, $fromPu) {
  static $v, $g, $t, $f;
// static $fromPv, $toPu, $toPl, $distv, $lfromP, $ltoPu;

  $f=fopen(replaceAll($readfile, '{fromPu}', $fromPu), 'r');
  if (!$f) return;
  $g=fopen(replaceAll($writefile, '{fromPu}', $fromPu), 'w');
  if (!$g) return;

  $lfromP=-1; $ltoPu=-1;
  while (!feof($f)) {
    $t=ftell($f);
    $v=fscanf($f, '%s');
    if (!$v) continue;
    if ($v[0][0]!='#') continue;

    fprintf($g, replaceAll("{indexP} {indexPo}\r\n", '{indexP}', $v[0], '{indexPo}', numT($t)) );

    }

  fclose($g);
  fclose($f);
  }

for (; $fromPuLen>0; $fromPuLen--) {

echo 'indexing started.. fromPu='.$fromPu.'<br/>';
makeindex($readfile, $writefile, $fromPu); // readfileform, fromPu
echo 'indexing finished..<br/>';

$fromPu++;

}

$fromPuLen=$lfromPuLen;
if ($fromPu<999) echo replaceAll('<a href={exec}?fromPu={fromPu}&fromPuLen={fromPuLen} target=_self>next : fromPu={fromPu}..</a>', '{exec}', $_SERVER['SCRIPT_NAME'], '{fromPu}', $fromPu, '{fromPu}', $fromPu, '{fromPuLen}', $fromPuLen);

?>
</div>



...

6)

제가 해본 내용은 여기까지입니다..

제가 했던 방법은 XP 32bit 버전으로 하기위한 방법이었을 뿐인거였죠..
.. 다른 분들은 어떠셨는지 모르겠네요.

*참고*
http://www.facebook.com/SKplanetCodeSprint/posts/366332640116963 - round1 시작..

http://c.cyworld.com/17126625/note/821897 - 용량이 ㄷㄷ..
http://c.cyworld.com/17126625/note/822202 - 일단 feof 사용..
http://c.cyworld.com/17126625/note/822499 - split..?
http://c.cyworld.com/17126625/note/822581 - 코드패턴은..?
http://c.cyworld.com/17126625/note/824364 - javascript와 공조해야할지..
http://c.cyworld.com/17126625/note/825871 - 압축 의견이..
http://c.cyworld.com/17126625/note/826050 - 압축하기 전에..
http://c.cyworld.com/17126625/note/826055 - 압축 후 예상 코드길이 상상중..
http://c.cyworld.com/17126625/note/827156 - 압축 완료..
http://c.cyworld.com/17126625/note/828119 - .. 이후 어떻게할지 고민중.. 
http://c.cyworld.com/17126625/note/829257 - index 생성..
http://c.cyworld.com/17126625/note/830009 - to 중심으로 한번 더 만들까..

http://www.facebook.com/SKplanetCodeSprint/posts/370674426349451 - round1 종료..

http://c.cyworld.com/17126625/note/836687 - 저장기능을 써야하는가.. (round1 고민중..)

http://www.facebook.com/SKplanetCodeSprint/posts/372852512798309 - round2 시작..

http://c.cyworld.com/17126625/note/837249 - .. PC 안켜지기 시작 = =;..

http://www.facebook.com/SKplanetCodeSprint/posts/376187922464768 - round2 종료..

http://c.cyworld.com/17126625/note/854950 - PC 복구됨.. round2 까지 종료된지 좀 됐음.. 이후 code sprint 접근할 생각 못함 = =;..

easyBow killofki@.



덧글

댓글 입력 영역

분석기


한국파워블로거협동조합 배너

http://cafe.naver.com/powerbloggeraliance

구글 Adsense

구글검색

애드센스 긴거

meta Loader