Thread View: pl.comp.lang.c
8 messages
8 total messages
Started by Jacek Marcin Jaworski
Wed, 20 Mar 2024 16:20
Jakie są zasady pracy z stdin?
Author: Jacek Marcin Jaworski
Date: Wed, 20 Mar 2024 16:20
Date: Wed, 20 Mar 2024 16:20
15 lines
1408 bytes
1408 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?
Author: heby
Date: Wed, 20 Mar 2024 18:01
Date: Wed, 20 Mar 2024 18:01
15 lines
1602 bytes
1602 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?
Author: Jacek Marcin Jaworski
Date: Wed, 20 Mar 2024 20:35
Date: Wed, 20 Mar 2024 20:35
22 lines
1926 bytes
1926 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?
Author: heby
Date: Wed, 20 Mar 2024 21:22
Date: Wed, 20 Mar 2024 21:22
17 lines
1852 bytes
1852 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 są zasady pracy z stdin?
Author: Arnold Ziffel
Date: Wed, 20 Mar 2024 23:17
Date: Wed, 20 Mar 2024 23:17
13 lines
1545 bytes
1545 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?
Author: heby
Date: Thu, 21 Mar 2024 07:17
Date: Thu, 21 Mar 2024 07:17
23 lines
2069 bytes
2069 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?
Author: Jacek Marcin Jaworski
Date: Thu, 21 Mar 2024 14:59
Date: Thu, 21 Mar 2024 14:59
26 lines
2334 bytes
2334 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?
Author: heby
Date: Thu, 21 Mar 2024 15:37
Date: Thu, 21 Mar 2024 15:37
19 lines
2071 bytes
2071 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