Yii2: Create Large Dummy Data Use Faker

keep-calm-and-lorem-ipsumDummy data adalah data fake yang digunakan untuk testing aplikasi. Nah Yii2 melalui extension Faker (https://packagist.org/packages/fzaninotto/faker) membuatnya hal ini semakin mudah. Faker itu merupakan extension untuk menggenerate fake data secara random, kerennya, data yang dihasilkan oleh Faker ini tidak kelihatan fake seperti data normal. Extension ini telah ready ketika kita install Yii2, so tinggal pake.

Jadi sebenarnya, kemaren di Grup FB Yii Indonesia ada temen yang mengalami masalah ketika menggunakan data dari tabel dengan record hingga puluhan juta. Masalahnya adalah lemot bahan sampe aplikasi gak mau loading (baca: ngambek). Karena penasaran, dan ingin ngetest juga maka saya perlu membuat tabel berisi data dummy dengan jumlah baris yang puluhan juta juga.

Oke langsung saja.

1) Bikin tabel, employee

CREATE TABLE IF NOT EXISTS `employee` (
  `id` bigint(33) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `gender` int(1) NOT NULL,
  `born` date NOT NULL,
  `email` varchar(50) NOT NULL,
  `phone` varchar(25) NOT NULL,
  `address` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

2) Dengan menggunakan Gii, generate model employee
3) Pada SiteController, use Faker;
4) Masih pada SiteController, buatlah fungsi untuk menggenerate random data

public function actionGenerate($row=10,$iterate=1){
	$start = microtime(true);
	$faker = Faker\Factory::create();
	$datas = [];
	for($j=1;$j<=$iterate;$j++){
		for($i=1;$i<=$row;$i++){										
			$datas[$i]=[$faker->name,rand(0,1),$faker->dateTimeThisCentury->format('Y-m-d'),$faker->email,$faker->phoneNumber,$faker->streetAddress];
		}	
		\Yii::$app->db->createCommand()->batchInsert('employee', ['name', 'gender', 'born', 'email', 'phone', 'address'], $datas)->execute();
	}	
	
	$time_elapsed_us = microtime(true) - $start;
	echo ($row*$iterate).' = '.$time_elapsed_us.' <br>';
}

Lihatlah betapa mudahnya kita menggunakan faker, btw mengapa ada iterate? hal itu karena sekali batchInsert, hanya bisa untuk 9000-an record, nah untuk memaksimalkan yang tinggal dilakukan perulangan (iterate)

5) Jangan lupa allow fungsi ini, pada SiteController, method behaviours, tambahkan generate

[
	'actions' => ['logout', 'index','generate'],
	'allow' => true,
	'roles' => ['@'],
],

6. Sebelum dijalankan, silahkan edit nilai parameter dari php.ini berikut:

	max_execution_time=36000
	memory_limit=12800M

initinya adalah dimaksimalkan..

Kemudian jangan lupa restart Apache.. agar perubahan php.ini tersebut dijalankan

7. Silahkan akses fungsi generate,

	site/generate?row=9000&iterate=1000

Ini perintah untuk menggenarte 9 juta data.

8. Abis itu tinggal tidur..

Bangun2 jika Anda beruntung maka data dummy 9 juta record dengan format yang bagus udah bisa Anda dapatkan :)

CMIIW

Leave a Reply

Your email address will not be published. Required fields are marked *