Если вы делаете «df.count> 0». Он учитывает количество всех разделов для всех исполнителей и добавляет их в Driver. Это займет некоторое время, когда вы имеете дело с миллионами строк.
Лучший способ сделать это - выполнить «df.take (1)» и проверить, является ли его нулевым. Это вернет «java.util.NoSuchElementException», поэтому лучше попробовать «df.take (1)».
. Dataframe возвращает ошибку, когда take (1) выполняется вместо пустой строки , Я выделил конкретные строки кода, где он выдает ошибку.
std::ifstream
имеет метод rdbuf()
, который возвращает указатель на filebuf
. Можно тогда "продвинуть" это filebuf
в Ваш stringstream
:
#include <fstream>
#include <sstream>
int main()
{
std::ifstream file( "myFile" );
if ( file )
{
std::stringstream buffer;
buffer << file.rdbuf();
file.close();
// operations on the buffer...
}
}
РЕДАКТИРОВАНИЕ: Как Martin York отмечает в комментариях, это не могло бы быть быстрым решением, так как stringstream
operator<<
считает filebuf символ символом. Вы могли бы хотеть проверить его ответ, где он использует ifstream
read
метод, как Вы раньше делали, и затем устанавливали эти stringstream
буфер для указания на ранее выделенную память.
Другая вещь иметь в виду состоит в том, что файловый ввод-вывод всегда будет самой медленной операцией. Решение Luc Touraille корректно, но существуют другие опции. Чтение всего файла в память сразу будет намного быстрее, чем отдельные чтения.
Это походит на преждевременную оптимизацию мне. Сколько работы делается в обработке. При принятии modernish рабочего стола/сервера, и не встроенной системы, копировании некоторых МБ данных во время инициализации является довольно дешевым, особенно по сравнению с прочитыванием файла диска во-первых. Я придерживался бы с тем, что Вы имеете, измеряете систему, когда это завершено, и решение, если потенциальное увеличение производительности стоило бы того. Конечно, если память трудна, это находится во внутреннем цикле или программе, которую часто называют (как однажды секунда), который изменяет баланс.
Хорошо. Я не говорю, что это будет более быстро, чем чтение из файла
, Но это - метод, где Вы создаете буфер однажды и после того, как данные считаны в буферное использование это непосредственно как источник для stringstream.
N.B. стоит упомянуть что станд.:: ifstream буферизуется. Это считывает данные из файла в (относительно больших) блоках. Операции с потоками выполняются против буфера, только возвращающегося к файлу для другого чтения, когда больше данных необходимо. Таким образом, прежде, чем высосать все данные в память проверьте, что это - горлышко бутылки.
#include <fstream>
#include <sstream>
#include <vector>
int main()
{
std::ifstream file("Plop");
if (file)
{
/*
* Get the size of the file
*/
file.seekg(0,std::ios::end);
std::streampos length = file.tellg();
file.seekg(0,std::ios::beg);
/*
* Use a vector as the buffer.
* It is exception safe and will be tidied up correctly.
* This constructor creates a buffer of the correct length.
*
* Then read the whole file into the buffer.
*/
std::vector<char> buffer(length);
file.read(&buffer[0],length);
/*
* Create your string stream.
* Get the stringbuffer from the stream and set the vector as it source.
*/
std::stringstream localStream;
localStream.rdbuf()->pubsetbuf(&buffer[0],length);
/*
* Note the buffer is NOT copied, if it goes out of scope
* the stream will be reading from released memory.
*/
}
}