Thanks Dennis, awesome feedback!
On Mon, Apr 12, 2010 at 5:53 PM, Richard U <richard....@gmail.com> wrote: > Dennis thats the function if you want to have a look at it... > > public function executeIndex(sfWebRequest $request) { > > ini_set('memory_limit','512M'); > set_time_limit(60*5); > sfConfig::set('sf_logging_enabled', false); > sfConfig::set('sf_web_debug', false); > > $timer = new Timer; > $timer->start_time(); > > $this->submited_bulk_stats = > $request->getParameterHolder()->get('bulk_stats'); > > $this->form = new BulkAddStatsForm(); > > $this->count_updated_records = 0; > $this->count_inserted_records = 0; > > if ($request->isMethod('post')) > { > $this->form->bind($request->getParameter('bulk_stats'), > $request->getFiles('bulk_stats')); > if ($this->form->isValid()) > { > $values = $this->form->getValues(); > > $file = $this->form->getValue('file'); > $file_name = > str_replace($file->getOriginalExtension(), '', > $file->getOriginalName()); > $save_to = > sfConfig::get('sf_upload_dir').DIRECTORY_SEPARATOR.'uploaded_'.$file_name.'_'.date("dmYHis").$file->getOriginalExtension(); > $file->save($save_to); > > echo "<br>File saved: $save_to"; > echo "<br>File size: ".filesize($save_to); > > // get accounts > $accounts = AccountsPeer::doSelect(new > Criteria()); > $re_indexed_accounts = > $re_indexed_accounts_by_id = array(); > foreach ($accounts as $tmp_account) { > > $re_indexed_accounts[$tmp_account->getAffName().$tmp_account->getAffUser()] > = $tmp_account; > > $re_indexed_accounts_by_id[$tmp_account->getId()] = $tmp_account; > } > > // get parking programs > $parking_programs = > ParkingProgramPeer::doSelect(new Criteria()); > $re_indexed_parking_programs = array(); > foreach ($parking_programs as $pp) { > > $re_indexed_parking_programs[$pp->getId()] = $pp; > } > > // Process the uploaded file > $objReader = new PHPExcel_Reader_Excel2007; > $objPHPExcel = $objReader->load($save_to); > > // Define allowed columns > $allowed_columns = > array('domain','views','clicks','revenue','currency','date','park','account'); > $re_indexed_data = array(); > $data = > $objPHPExcel->getActiveSheet()->toArray(); > > // Get db connections since we are using two > different db's here > $connection_cdb = Propel::getConnection(); > $connection_stats = > Propel::getConnection('cdb_stats'); > > // get domains > $domains_re_indexed = array(); > $query = 'SELECT * FROM domains'; > $statement = $connection_cdb->prepare($query); > $statement->execute(); > while ($dObj = $statement->fetch(PDO::FETCH_OBJ)) > { > $domains_re_indexed[$dObj->dn] = > array('domain_id'=>$dObj->domain_ID, 'deal_id'=>$dObj->deal_id); > } > > try { > $validated_data = array(); > $sfLogger = > sfContext::getInstance()->getLogger(); > > foreach($data as $row_number => $row) { > $batch_options = array(); > > // Check its not an empty row > if (!strlen(implode("", > $row))) { > continue; > } > > foreach($row as $col_number => > $col) { > echo "<br>MEMORY: > ".memory_get_usage(); > if ($row_number == 1) { > $col = > strtolower($col); > $key = > array_search($col, $allowed_columns); > if ($key !== > false) { > > $data_indexes[$col_number] = $allowed_columns[$key]; > } > } else { > if > (isset($data_indexes[$col_number]) && > strlen($data_indexes[$col_number]) && strlen($col)) { > if > ($data_indexes[$col_number] == "date") { > > $col = date("Y-m-d", strtotime(str_replace("/", "-", $col))); > } > > $batch_options[$data_indexes[$col_number]] = $col; > } > } > } > > if ($row_number > 1) { > > // Park info now comes > from the form > if > (!isset($values['parking_program']) || > !strlen($values['parking_program'])) { > throw new > Exception('Missing or invalid parking program'); > } else { > > $batch_options['aff_name'] = > strtolower($re_indexed_parking_programs[$values['parking_program']]->getName()); > } > > // Account info now > comes from the form > if > (!isset($values['accounts']) || !strlen($values['accounts'])) { > throw new > Exception('Missing or invalid parking account'); > } else { > > $batch_options['aff_user'] = > strtolower($re_indexed_accounts_by_id[$values['accounts']]->getAffUser()); > } > > // Specify for batch > results to be returned as a serialized array > $batch_results = > array(); > > $batch_options['return_results'] = true; > $batch_options['row'] > = $row_number; > > $batch_options['skip_merge'] = 1; > > $output = array(); > foreach($batch_options > as $k=>$v) { > $output[] = > "$k:$v"; > } > echo "<br>".implode(", > ", $output); > flush(); > > // Validate and set > data > $c = new Criteria(); > > > $c->add(DailyStatsTempPeer::DN, $batch_options['domain']); > > $c->add(DailyStatsTempPeer::AFF_NAME, $batch_options['aff_name']); > > $c->add(DailyStatsTempPeer::AFF_USER, $batch_options['aff_user']); > > $c->add(DailyStatsTempPeer::VIEWS, $batch_options['views']); > > $c->add(DailyStatsTempPeer::CLICKS, $batch_options['clicks']); > > $c->add(DailyStatsTempPeer::REVENUE, $batch_options['revenue']); > > $c->add(DailyStatsTempPeer::STAT_DATE, $batch_options['date']); > > $c->add(DailyStatsTempPeer::STAT_CURRENCY, $batch_options['currency']); > > // Set other data that > needs to be added with the stats > // ~ Set click rate > > $c->add(DailyStatsTempPeer::CLICK_RATE, > ($c->getValue(DailyStatsTempPeer::VIEWS) ? > $c->getValue(DailyStatsTempPeer::CLICKS)/$c->getValue(DailyStatsTempPeer::VIEWS) > : 0)); > // ~ Set revenue per > click > > $c->add(DailyStatsTempPeer::REVENUE_PER_CLICK, > ($c->getValue(DailyStatsTempPeer::CLICKS) ? > $c->getValue(DailyStatsTempPeer::REVENUE)/$c->getValue(DailyStatsTempPeer::CLICKS) > : 0)); > // ~ Set data from > accounts table > > if > (isset($re_indexed_accounts[$c->getValue(DailyStatsTempPeer::AFF_NAME).$c->getValue(DailyStatsTempPeer::AFF_USER)])) > { > $account = > $re_indexed_accounts[$c->getValue(DailyStatsTempPeer::AFF_NAME).$c->getValue(DailyStatsTempPeer::AFF_USER)]; > > $c->add(DailyStatsTempPeer::BONUS, $account->getBonus()); > > $c->add(DailyStatsTempPeer::REV_SPLIT, $account->getRevSplit()); > > $c->add(DailyStatsTempPeer::COMPANY, $account->getCompany()); > > $c->add(DailyStatsTempPeer::ACCOUNT_ID, $account->getId()); > } else { > > $sfLogger->err("{".basename(__file__)."} Account not found > for Park: {$c->getValue(DailyStatsTempPeer::AFF_NAME)} > > Account:{$c->getValue(DailyStatsTempPeer::AFF_USER)} on row > $row_number"); > throw new > Exception('Account not found for > Park:'.$c->getValue(DailyStatsTempPeer::AFF_NAME).', > > Account:'.$c->getValue(DailyStatsTempPeer::AFF_USER).' on row > '.$row_number); > } > // ~ Set additional > colums data recently added > if > (isset($domains_re_indexed[$batch_options['domain']])) { > $domain = > $domains_re_indexed[$batch_options['domain']]; > > $c->add(DailyStatsTempPeer::DOMAIN_ID, $domain['domain_id']); > > $c->add(DailyStatsTempPeer::DEAL_ID, $domain['deal_id']); > } > > if > ($batch_options['date'] == '1970-01-01' || > $batch_options['date'] == '1969-12-31') { > > $sfLogger->err("{".basename(__file__)."} Invalid date format: > {$batch_options['date']} on row $row_number"); > throw new > Exception('Please change date format in excel file > to dd/mm/yyyy'); > } > > > $checkIfRecordExistsCriteria = new Criteria(); > > $checkIfRecordExistsCriteria->add($c->getCriterion(DailyStatsTempPeer::STAT_DATE)); > > $checkIfRecordExistsCriteria->add($c->getCriterion(DailyStatsTempPeer::DN)); > > $checkIfRecordExistsCriteria->add($c->getCriterion(DailyStatsTempPeer::AFF_NAME)); > > $checkIfRecordExistsCriteria->add($c->getCriterion(DailyStatsTempPeer::AFF_USER)); > > // Set the daily stat > entree information to be used for logging > > $daily_stat_record_info = > DailyStatsTempPeer::DN.":".$c->getValue(DailyStatsTempPeer::DN).", ". > > DailyStatsTempPeer::AFF_NAME.":".$c->getValue(DailyStatsTempPeer::AFF_NAME).", > ". > > DailyStatsTempPeer::AFF_USER.":".$c->getValue(DailyStatsTempPeer::AFF_USER).", > ". > > DailyStatsTempPeer::STAT_DATE.":".$c->getValue(DailyStatsTempPeer::STAT_DATE)." > Row: $row_number"; > > $affected_rows = > DailyStatsTempPeer::doDelete($checkIfRecordExistsCriteria, > $connection_stats); > > DailyStatsTempPeer::doInsert($c, $connection_stats); > > if ($affected_rows) { > > $this->count_updated_records++; > } else { > > $this->count_inserted_records++; > } > > > DealsPeer::clearInstancePool(); > > DailyStatsTempPeer::clearInstancePool(); > > AccountsPeer::clearInstancePool(); > > DomainsPeer::clearInstancePool(); > > ParkingProgramPeer::clearInstancePool(); > } > } > > sfBatchHelper::executeBatch('mergeDailyStatsTempToDailyStats', array()); > > } catch (Exception $e) { > $this->getUser()->setFlash('error', > var_export($e, true), false); > } > } > } > // Remove the uploaded file > if (isset($save_to) && strlen($save_to) && > file_exists($save_to)) { > unlink($save_to); > } > $this->submited_bulk_stats = $submited_bulk_stats; > } > > > > Works fine with a couple of thousand rows... but its clear to see the > memory going up > Don't know what this will tell you that i haven't already > > > > On Mon, Apr 12, 2010 at 5:28 PM, Dennis Benkert > <spinecras...@googlemail.com> wrote: >> So, how big are these CSV files? How many lines are you processing and >> can you tell us how many entries you're inserting to your DB using >> Propel? >> >> It would be best if you could show us the code that implements what >> you described in your last mail. Investing maybe 30 minutes to write >> an email that desribes the problem you have, what part of your code >> suffers from it and the data you're using will most likely keep you >> away from writing 5 or more emails desribing everything. Plus it will >> stop me asking stupid questions because I have to digg into your >> problem this way. :) >> >> - Dennis >> >> 2010/4/12 Richard U <richard....@gmail.com>: >>> I am uploading a csv file...... >>> i require looping over each row... the data in each column has to be >>> processed individually and allocated to the right table... >>> >>> >>> >>> >>> On Mon, Apr 12, 2010 at 3:56 PM, Dennis Benkert >>> <spinecras...@googlemail.com> wrote: >>>> Although I am pretty sure you are frustrated there is no reason to show >>>> disrespect to other people. >>>> >>>> Christian's point is that we cannot help you without getting some >>>> information about your specific problem. Maybe you can provide some code >>>> sample that show us your memory problems. Also it's interesting to know >>>> what you want to do with the code (are you inserting thousands of entries, >>>> looping over many entries and saving them again, etc.). >>>> >>>> - Dennis >>>> >>>> Am 12.04.2010 um 07:41 schrieb Slavka <richard....@gmail.com>: >>>> >>>>> Christian have you just started using symfony? if not then i am sure >>>>> you are aware of the memory leaks i am talking about... >>>>> >>>>> Cheers >>>>> >>>>> On Apr 12, 3:30 pm, Christian Schaefer <cae...@gmail.com> wrote: >>>>>> >>>>>> Hi Slavka, >>>>>> >>>>>> from your tiny description it is not clear whether the leak you >>>>>> experience is a result of Propel or symfony or your usage of them. >>>>>> >>>>>> You should know that symfony 1.2 is no longer supported but replaced >>>>>> by symfony 1.4. The favoured ORM nowadays is Doctrine although Propel >>>>>> is still supported. >>>>>> >>>>>> But most importantly: you posted a complaint rather than a question. >>>>>> This might work with a licenced software from some company but with an >>>>>> open source community a certain netiquette should apply. >>>>>> >>>>>> Cheers >>>>>> /Christian >>>>>> >>>>>> On 12 Apr., 05:51, Slavka <richard....@gmail.com> wrote: >>>>>> >>>>>> >>>>>> >>>>>>> It seems to be pretty clear the symfony 1.2 and propel are still full >>>>>>> of memory leaks... I have a simple for loop selecting the same object >>>>>>> into the same variable... in theory this should not lead to increase >>>>>>> memory use for every loop however that is what is happening... >>>>>> >>>>>>> Has anyone every looked into this... if so what are options to handle >>>>>>> the leaks... , if there is no solution we are going to have to >>>>>>> consider just using mysql functions... >>>>>> >>>>>>> Regards >>>>> >>>>> -- >>>>> If you want to report a vulnerability issue on symfony, please send it to >>>>> security at symfony-project.com >>>>> >>>>> You received this message because you are subscribed to the Google >>>>> Groups "symfony users" group. >>>>> To post to this group, send email to symfony-users@googlegroups.com >>>>> To unsubscribe from this group, send email to >>>>> symfony-users+unsubscr...@googlegroups.com >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/symfony-users?hl=en >>>>> >>>>> To unsubscribe, reply using "remove me" as the subject. >>>> >>>> -- >>>> If you want to report a vulnerability issue on symfony, please send it to >>>> security at symfony-project.com >>>> >>>> You received this message because you are subscribed to the Google >>>> Groups "symfony users" group. >>>> To post to this group, send email to symfony-users@googlegroups.com >>>> To unsubscribe from this group, send email to >>>> symfony-users+unsubscr...@googlegroups.com >>>> For more options, visit this group at >>>> http://groups.google.com/group/symfony-users?hl=en >>>> >>> >>> -- >>> If you want to report a vulnerability issue on symfony, please send it to >>> security at symfony-project.com >>> >>> You received this message because you are subscribed to the Google >>> Groups "symfony users" group. >>> To post to this group, send email to symfony-users@googlegroups.com >>> To unsubscribe from this group, send email to >>> symfony-users+unsubscr...@googlegroups.com >>> For more options, visit this group at >>> http://groups.google.com/group/symfony-users?hl=en >>> >> >> -- >> If you want to report a vulnerability issue on symfony, please send it to >> security at symfony-project.com >> >> You received this message because you are subscribed to the Google >> Groups "symfony users" group. >> To post to this group, send email to symfony-users@googlegroups.com >> To unsubscribe from this group, send email to >> symfony-users+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/symfony-users?hl=en >> > -- If you want to report a vulnerability issue on symfony, please send it to security at symfony-project.com You received this message because you are subscribed to the Google Groups "symfony users" group. To post to this group, send email to symfony-users@googlegroups.com To unsubscribe from this group, send email to symfony-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/symfony-users?hl=en