файл сразу после его передачи клиенту, если вы знаете, что он вам больше не понадобится.
ужно экспортировать данные из MySQL в CSV. Я должен выбрать данные из нескольких таблиц, поместив их в массивы, затем обработать их и вернуть в браузер как .csv. Я заметил, что массивы потребляют огромное количество строк. Например, я импортировал файл .csv в базу данных размером 1.8M, затем я пытаюсь экспортировать эти данные из базы данных в файл .csv. Memory_get_peak_usage () показывает более 128M для хранения массивов с данными.
Например, этот небольшой массив занимает более 700 байтов:
$startMemory = memory_get_usage();
//get constant fields of the subscriber
$data = array(array('subscriber_id' => 1315444, 'email_address' => 'test0@gmail.com',
'first_name' => 'Michael', 'last_name' => 'Allen'));
echo memory_get_usage() - $startMemory;
Поэтому для экспорта даже нескольких мегабайт данных требуется сотни мегабайт памяти в сценарии php. Есть ли способ решить эту проблему? Таблицы:
CREATE TABLE `subscribers` (
`subscriber_id` int(10) unsigned NOT NULL auto_increment,
`list_id` int(10) unsigned NOT NULL,
`account_id` int(10) unsigned NOT NULL,
`email_address` varchar(100) collate utf8_unicode_ci NOT NULL,
`first_name` varchar(50) collate utf8_unicode_ci NOT NULL default '',
`last_name` varchar(50) collate utf8_unicode_ci NOT NULL default '',
`ip` int(10) unsigned default NULL COMMENT '\nThe ip address of the subscriber that we can get when he opens the \nthe email or subscribe using subsribe form.\nTheoretically it can be used to segment by Location (which is not correct if someone uses proxy).',
`preferred_format` tinyint(4) NOT NULL default '0' COMMENT 'Preferred format of \n0 - HTML, \n1 -Text,\n2 - Mobile',
`state` tinyint(4) NOT NULL default '1' COMMENT '1 - subscribed\n2 - unsubscribed\n3 - cleaned\n4 - not confirmed, it means the user subscribed but has not confirmed it yet.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n',
`cause_of_cleaning` tinyint(4) NOT NULL default '0' COMMENT '\nThis field is the cause of moving the subscriber to the \n0 - not used\n1 - spam complaint\n2 - hard bounce\n3 - several soft bounces',
`date_added` datetime NOT NULL COMMENT 'The data when the subscriber was added. I suppose this field can be used in the conditions forming the segment',
`last_changed` datetime NOT NULL,
PRIMARY KEY (`subscriber_id`),
UNIQUE KEY `email_list_id` (`email_address`,`list_id`),
KEY `FK_list_id` (`list_id`),
CONSTRAINT `FK_list_id` FOREIGN KEY (`list_id`) REFERENCES `lists` (`list_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
CREATE TABLE `subscribers_multivalued` (
`id` int(10) unsigned NOT NULL auto_increment,
`subscriber_id` int(10) unsigned NOT NULL,
`field_id` int(10) unsigned NOT NULL,
`value` varchar(100) collate utf8_unicode_ci NOT NULL,
`account_id` int(10) unsigned NOT NULL COMMENT '\nThe identifier of the account',
PRIMARY KEY (`id`),
KEY `subscriber_fk` (`subscriber_id`),
KEY `field_fk` (`field_id`),
CONSTRAINT `field_fk_string_multivalued` FOREIGN KEY (`field_id`) REFERENCES `custom_fields` (`field_id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `subscriber_fk_multivalued` FOREIGN KEY (`subscriber_id`) REFERENCES `subscribers` (`subscriber_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
CREATE TABLE `subscribers_custom_data_string` (
`subscriber_id` int(10) unsigned NOT NULL,
`field_id` int(10) unsigned NOT NULL,
`value` varchar(255) collate utf8_unicode_ci NOT NULL,
`account_id` int(10) unsigned NOT NULL COMMENT '\nThe identifier of the account',
PRIMARY KEY (`subscriber_id`,`field_id`),
KEY `subscriber_fk` (`subscriber_id`),
KEY `field_fk` (`field_id`),
CONSTRAINT `field_fk_string` FOREIGN KEY (`field_id`) REFERENCES `custom_fields` (`field_id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `subscriber_fk_string` FOREIGN KEY (`subscriber_id`) REFERENCES `subscribers` (`subscriber_id`) ON DELETE CASCADE ON UPDATE CASCADE
)
Есть другие таблицы для полей, аналогичные таблице со строками для чисел, дат. Для них первичным ключом является subscriber_id, field_id.
Когда запрос не выполняется (например, у нас есть несколько пользовательских полей):
ВЫБРАТЬsubscribers
.email_address
, subscribers
.first_name
, subscribers
.last_name
, GROUP_CONCAT (t1.value SEPARATOR '|') AS Цвета, GROUP_CONCAT (t2.value SEPARATOR '|') AS Языки ОТsubscribers
ЛЕВОЕ СОЕДИНЕНИЕsubscribers_multivalued
КАКt1
ПО подписчикам: sub_criber_id = t1.subscriber_id И t1.field_id = 112.subscribers_multivalued
КАКt2
ПО подписчикам.subscriber_id = t2.subscriber_id И t2.field_id = 111 ГДЕ (list_id = 40) GROUP BYsubscribers
.email_address
, subscribers
.first_name
, subscribers
.last_name
Это вернуло бы это:
test1000@gmail.com Мишель Буш Красный | Красный | Синий | Синий Английский | Испанский | Английский | Испанский вместо test1000@gmail.com Мишель Буш Красный | Синий Английский | Испанский
Спасибо за любую информацию.