Best practices ============== There are several recommended best practices when using the 1010data Python SDK. **Clean up your sessions upon query completion** Use the ``with`` keyword to clean up sessions. For more information, see :ref:`Cleaning up a session`. **Consider your result set when accessing data** When you access a piece of data from the result set of a Query, py1010 downloads a "window" of data from the column(s) in question. The default window size is 50000. (When there are many columns, py1010 will automatically reduce the window size if the number of cells being downloaded exceeds the limit which the server is willing to send.) So if you access ``query[1][150]``, py1010 will download elements 0-49999 of column 1 from the result set, and if you access ``query.rows[120030]`` then py1010 will download elements 100000-149999 of all the columns, and so on. This works well for situations when you are mostly accessing data that is close together, like when stepping through the query row by row (such as ``for row in query.rows:...``). If you are performing more random access of the data, getting only one or two elements from each window, you may find the overhead of fetching these large windows affects your performance. This is especially true if you are fetching many columns at once (such as using ``query.rows`` on a query with many columns.) In such cases, you may want to reduce the size of the window being downloaded each time, by setting the :attr:`py1010.Query.win_size` member of the Query object to something smaller, such as ``100`` or ``1000``. **Have each thread create a Session object** In a multithreaded application, each thread should create its own ``Session`` object. If multiple threads that share a single ``Session`` object interact with the object in parallel, all but one of the threads will be queued. Users will experience much better performance if each thread has its own ``Session`` object. These objects can all be connected to the same Insights Platform session via ``py1010.POSSESS``.