timo-71

Рейтинг
63
Регистрация
19.09.2018
Sly32 #:
Да, я тоже от формата ушел. А вот в логгировании тоже до сих пор использую % - это дешевле считается

На самом деле - хорошо, что гибко. Шаблон может быть взят откуда угодно.

>>> t = 'i = %s'
>>> for i in range(3):
...     print(t % i)
...
i = 0
i = 1
i = 2

%, "".формат() - легко, а с  f-string придется прокладки какие то мутить.

ЗыЖ Вроде, где то читал, что f-string быстрее всех, но это неточно. Не проверял.


Sly32 #:

Ух ты любишь %? Через f-string принтить нагляднее)

Вредная привычка - 2 натура😣 А так, если больше 2/3 переменных, то скорее так напишу.

print(f'b_list[{i}]={v}')

А вот так - 

print('b_list[{}]={}'.format(i, v))
не люблю.


regta :
b_list = a_list
b_list.remove(a_list[0])

В курсе, что изменение b_list приведет к изменению а_list? Ибо это ссылки на одно и тоже.

assert id(b_list) == id(a_list), 'одинаковы ли переменные?'

regta :
for i in range(0,len(b_list) + 1):

будет list index out of range,  [1,2,3] - len(b_list) = 3 => b_list[3]  юк

Проще все

for i, v in enumerate(b_list):
    print('b_list[%s]=%s' % (i, v))
postavkin #:
Но у меня ошибка 500

Там просто пых 8, у вас 5+, судя по mysql_query

Вы просто в своем скрипте приберитесь

$urlmass[] = $url;
                                        $newmass[] = $stroka;
                                        $stroka = trim($stroka, "\n");
                                        $e = "$stroka\n";
                                        fwrite($filesotbor,$e);
Как минимум в этой части. У вас память кушает      $newmass[] = $stroka; Т.е. вы по факту копируете файл в массив, который неясно зачем нужен. Выше, я обращал внимание на это Другое, тонкое место
$urlmass[] = $url;
Если, урлов накопится достаточно, чтобы переполнить доступную скрипту память будет тот же эффект. Но, в любом случае их будет не 3 млн и урл меньше всей строки.
postavkin #:
Вообщем. Я разбил файл на 6. По 500Мб. Заливаю на хост в базу. Думаю это решение.

Как знать. Может - решение сделать все более-менее правильно. 2 минуты контрол-с/контрол-в, + несколько строк:

<?php
header('Content-Type:text/plain');

set_error_handler(function($code, $string, $file, $line){
throw new ErrorException($string, null, $code, $file, $line);
});

register_shutdown_function(function(){
$error = error_get_last();
if(null !== $error)
{
echo 'Last error: ';
print_r($error);
}
});

class tm {

private $tm = 0, $start = 0;

public function __construct( )
{
$this->start = microtime(1);
$this->tm = $this->start;
}

public function _($msg){
echo "\n----\nTrace: ", $msg, ":\n";
$t = microtime(1);
echo
" Mem,mb (usage/peak_usage): ",
sprintf('%01.2f / %01.2f', (memory_get_usage()/1048576), (memory_get_peak_usage()/1048576)),

"\n Time,ms (before start/before previous): ",
sprintf('%01.8f / %01.8f', ($t - $this->start)*1000, ($t - $this->tm)*1000 ), "\n--\n";
$this->tm = $t;
}
}

$tm = new tm();
$tm->_('start by phpversion ' . phpversion());

$fn = __DIR__ . '/5';
echo "\n",
sprintf("File to read: %s, size: %dMb", $fn, filesize($fn)/1048576);
$fn1 = __DIR__ . '/51';
$h = fopen($fn,'r');
$h1 = fopen($fn1,'w');
$i = 0;
while (($b = fgets($h)) !== false) {
#Имитация манипуляций со строкой
$b = explode(' ', $b);
$b = implode(' ', $b);
#Пишем.
fwrite($h1, $b);
$i++;
}

echo "\nLine in file: $i\n";
$tm->_(sprintf ('Newfilesize = %dMb; end ', filesize($fn1)/1048576));

fclose($h);
fclose($h1);

Результат:


Нетрудно заметить, то чтение 8гиг файла в 5000000  строк

Trace: Newfilesize = 8305Mb; end :
  Mem,mb (usage/peak_usage): 0.35 / 0.47
  Time,ms (before start/before previous): 86891.42990112 / 86891.41702652
На памяти практически не отражается и занимает примерно 86 сек.
postavkin #:
$urlmass[] = $url;
$newmass[] = $stroka;

Если $urlmass, что бы не собирать дубли урл, то назначение  $newmass не ясно. Зачем собирать файл в массив?

postavkin #:

Не, хватает на 10 тыс строк

К 10 тыс строке, в нем копия 10 тыс строк из файла. Поэтому и Allowed memory size. По остальному - воздержусь.

danforth #:

В Go из-за отсутствия дженериков нет нормального способа для работы с коллекциями данных (filter, map). 

Это, да, сильно неудобно. Сочувствую. У меня  львиная доля это манипуляции с какими то коллекциями.

Полагаю, издержки типизации - за скорость надо заплатить. Возможно, просто го относительно молодой язык, выше писали, что обещают довезти плюшки.

danforth #:
Но можешь попробовать, задачки ради)

Я пока не сильно погружался в го. Да и со временем туго. Но, чуть позже, обязательно вникну. Есть планы (го/или что) внедрить, что бы расширить некоторые узкие места в своих поделках.

danforth #:
Потому что язык по сути слишком прост, и когда доходишь до решения какой-то задачи, то большая часть кода начинает становиться слишком императивной. У меня наверное уже с 20 проектов на нем написано, суммарно строк кода наверное перевалило за 400k (хотя я не считал, может привираю), один из проектов держит 2млн/рпс. Язык без дженериков (обещают завести), без тайп-сум, с не очень удачной обработкой ошибок (но на порядок лучше чем эксепшены). Конечно, пока пишешь хело ворлды или байтики по сети гонять, то это все быстро и просто, а когда проект разрастается, то начинаешь тянуть кучу бойлерплейта из проекта в проект. 

Рутина, иными словами. Но, такое везде есть. Причем, существенная, наверное часть. "+/- " есть у всех языков, тут только вздохнуть: "такова селяви".

Sly32 #:
слабый хостинг им и положить можно
(aenv) [www@localhost php_sock]$ /home/www/go/bin/bombardier -c 800 -n 2000 -l -H "User-agent: Mozilla"  https://n.aio1/
Bombarding https://n.aio1:443/ with 2000 request(s) using 800 connection(s)
2000 / 2000 [=================================================================================================================] 100.00% 1108/s 1s
Done!
Statistics        Avg      Stdev        Max
  Reqs/sec      1171.34    1365.09    6251.16
  Latency      643.61ms   403.23ms      1.72s
  Latency Distribution
     50%   537.12ms
     75%      0.87s
     90%      1.23s
     95%      1.53s
     99%      1.69s
  HTTP codes:
    1xx - 0, 2xx - 1792, 3xx - 0, 4xx - 0, 5xx - 208 !!!!!!
    others - 0
  Throughput:    63.63MB/s

5xx типа того:

File "/var/www/aweb/aenv/lib/python3.9/site-packages/aioredis/connection.py", line 868, in read_response
    raise response from None
aioredis.exceptions.ResponseError: OOM command not allowed when used memory > 'maxmemory'.
Однозначно полезная. Люблю такими штучками играться😊
Sly32 #:
bombardier

Заценил


Всего: 541