🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

8 total messages Started by Jacek Marcin Jaw Wed, 20 Mar 2024 17:20
Jakie są zasady pracy z stdin?
#291864
Author: Jacek Marcin Jaw
Date: Wed, 20 Mar 2024 17:20
14 lines
462 bytes
Cześć!

Piszę prog. w C++ z Qt. Wczytuję dane z stdin. Robię to strumieniem
QTextStream(stdin). On ma 2 f.:
read(long long max);
readAll();

Mi się podoba pierwsza z nich, bo chcę kontrolować il. wczytywanych
danych by uniknąć buffer overflow. Jednak gdy wywołuję read((long long)
2*1024*1024*1024), to ta f. nic mi nie zwraca.
A gdy ją zamieniam  readAll(), to normalnie czyta dane.
O co w tym chodzi?

Spokojnego wieczoru.
Jacek Marcin Jaworski
Re: Jakie są zasady pracy z stdin?
#291865
Author: heby
Date: Wed, 20 Mar 2024 19:01
14 lines
551 bytes
On 20/03/2024 17:20, Jacek Marcin Jaworski wrote:
> Jednak gdy wywołuję read((long long)
> 2*1024*1024*1024), to ta f. nic mi nie zwraca.

Są mętne informacje o limicie QStringa.

https://forum.qt.io/topic/10302/what-is-the-maximum-length-of-string-that-qstring-object-can-hold/7

https://stackoverflow.com/questions/46237476/maximum-size-of-qstring

QString trzyma dane w pamieci nieefektywnie z punktu widzenia analizy
dużych ilości danych.

Nie chcesz aby uzyć do tego https://doc.qt.io/qt-6/qdatastream.html
w szczególności readRawData?
Re: Jakie są zasady pracy z stdin?
#291866
Author: Jacek Marcin Jaw
Date: Wed, 20 Mar 2024 21:35
21 lines
839 bytes
W dniu 20.03.2024 o 19:01, heby pisze:
> On 20/03/2024 17:20, Jacek Marcin Jaworski wrote:
>> Jednak gdy wywołuję read((long long) 2*1024*1024*1024), to ta f. nic
>> mi nie zwraca.
>
> Są mętne informacje o limicie QStringa.
>
> https://forum.qt.io/topic/10302/what-is-the-maximum-length-of-string-that-qstring-object-can-hold/7
>
> https://stackoverflow.com/questions/46237476/maximum-size-of-qstring
>
> QString trzyma dane w pamieci nieefektywnie z punktu widzenia analizy
> dużych ilości danych.
>
> Nie chcesz aby uzyć do tego https://doc.qt.io/qt-6/qdatastream.html
> w szczególności readRawData?
>

Dzięki za odp.
Jednak mi chodzi o prosty przypadek gdy mam kilka linii do odczytania z
stdin i wtedy read((long long) 2*1024*1024*1024) nic nie zwraca, a
readAll() zwraca wszystkie. Nie wiem jak to wytłumaczyć.
Re: Jakie są zasady pracy z stdin?
#291867
Author: heby
Date: Wed, 20 Mar 2024 22:22
16 lines
748 bytes
On 20/03/2024 21:35, Jacek Marcin Jaworski wrote:
> Jednak mi chodzi o prosty przypadek gdy mam kilka linii do odczytania z
> stdin i wtedy read((long long) 2*1024*1024*1024) nic nie zwraca

Może zgaduje, że rozmiar stringa będzie przekroczony. Dla mniejszych
buforów zadziała?

Ogólnie linie nalezy czytać przez jakąs wersję readline w pętli, a nie
łykajac wszystko do stringa za jednym razem. Ma to kilka zalet, np.
kompatybilność z koncepcją unixowych rurek i przetwrzania równoległego.

>, a
> readAll() zwraca wszystkie. Nie wiem jak to wytłumaczyć.

Jakimś ograniczeniem, zgaduję. 2GB to jednak bardzo duży bufor. Może
readAll robi to sprytniej i nie zakłada od razu 2GB danych. Nie wiem, to
corner case zapewne.
Re: Jakie =?ISO-8859-2?Q?s±?= zasady pracy z stdin?
#291868
Author: arnold@hootervil
Date: Wed, 20 Mar 2024 23:17
12 lines
399 bytes
heby <heby@poczta.onet.pl> wrote:

>> Jednak gdy wywo³ujê read((long long)
>> 2*1024*1024*1024), to ta f. nic mi nie zwraca.
>
> S± mêtne informacje o limicie QStringa.

O Qt wiem dok³adnie nic, ale oni serio wymy¶lili w³asnego stringa? W czym
im std::string przeszkadza³?

--
S³oñ i mrówka przechodz± przez most.. Most siê zerwa³..
Mrówka mówi do s³onia: A mówi³am ¿eby¶my przechodzili osobno..
Re: Jakie są zasady pracy z stdin?
#291869
Author: heby
Date: Thu, 21 Mar 2024 08:17
22 lines
967 bytes
On 21/03/2024 00:17, Arnold Ziffel wrote:
> O Qt wiem dokładnie nic, ale oni serio wymyślili własnego stringa? W czym
> im std::string przeszkadzał?

std::string wcale nie jest specjalnie dobry ani innowacyjny.

Przykładowo, wiele klas Qt, w tym QString, implementuje COW:

https://doc.qt.io/qt-6/implicit-sharing.html

Albo np, jeśli się to tyczy QStringa, dostarczają koncepcje fragmentów:

https://doc.qt.io/qt-6/qstringref.html

Jest też rzeczą wiadomą, że QStringi są deczko szybsze od std::,
wygodnie (i szybciej) operują na unicode.

Ogólnie, potraktuj części Qt jako niezwiązane z GUI. Oni mają jasno
określone gdzie zaczyna się i kończy [G]UI, a gdzie "core". Ten core
jest interesujący na wiele sposobów, w programowaniu niezwiązanym z UI.
Widziałem dużo kodu w którym używają QStringa jako zamiennika
std::string z dużym bonusem wydajności, a aplikacja jest "konsolowa" i
nic z interakcją z userem nie ma wspólnego.
Re: Jakie są zasady pracy z stdin?
#291870
Author: Jacek Marcin Jaw
Date: Thu, 21 Mar 2024 15:59
25 lines
1171 bytes
W dniu 20.03.2024 o 22:22, heby pisze:
> On 20/03/2024 21:35, Jacek Marcin Jaworski wrote:
>> Jednak mi chodzi o prosty przypadek gdy mam kilka linii do odczytania
>> z stdin i wtedy read((long long) 2*1024*1024*1024) nic nie zwraca
>
> Może zgaduje, że rozmiar stringa będzie przekroczony. Dla mniejszych
> buforów zadziała?

Dla mniejszych buforów działa!
Jednorazowo z stdin można maks. odczytać 2GB:
QString lWszytko = QTextStream(stdin).read((long long) 2 * 1024 * 1024 *
1024 - 1);
Zmyliła mnie błędna dok. f. QString QTextStream::read(qint64 maxlen).
Ona zwraca QString który ma operator[](int) oraz operator[](unsigned
int). Tak więc teoretycznie QString powinien mieć maks. dł. 4GB
(unsigned int). Jednak z jakiegoś powodu QTextStream obsługuje maks. 2GB.

Taka uwaga na koniec:
Nie jest przypadkiem, że odczytuję za jednym zamachem całe stdin. Bo
prog. konsoli zwane edytorami strumieniowymi mogą działać w 2 trybach:
linijkowym i blokowym.
W trybie linijkowym działa np. sed i grep i jest to problem gdy wzorzec
ma parę linii.
Natomiast w trybie blokowym działa np. sort i nie da się tego zmienić.

Dzięki wielkie Heby!
Re: Jakie są zasady pracy z stdin?
#291872
Author: heby
Date: Thu, 21 Mar 2024 16:37
18 lines
937 bytes
On 21/03/2024 15:59, Jacek Marcin Jaworski wrote:
> Jednak z jakiegoś powodu QTextStream obsługuje maks. 2GB.

Może to dlatego, że QString jest unixode i nieefektycznie trzyma dane w
RAM, na dwóch+ bajtach per znak.

> Taka uwaga na koniec:
> Nie jest przypadkiem, że odczytuję za jednym zamachem całe stdin. Bo
> prog. konsoli zwane edytorami strumieniowymi mogą działać w 2 trybach:
> linijkowym i blokowym.
> W trybie linijkowym działa np. sed i grep i jest to problem gdy wzorzec
> ma parę linii.
> Natomiast w trybie blokowym działa np. sort i nie da się tego zmienić.

Odczytując za jedny zamachem cały stdin, bez względu na zawartośc pliku
i jego budowę, jest błędem, bo uniemozliwia równoległą pracę obu
programów po dwóch stronach rurki. To że są programy wymagające całości
na raz, to raczej wyjątek w unixie. Idę o zakład, że nie stortujesz 2gb
pliku binarnego podwanego na stdin.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads