473,387 Members | 1,579 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Large array stored in session variable causes server to choke

Here's the sitch:

I read in a csv file with 60000 lines (20 fields per record), and store
the data to a local array. The file is read in and stored just fine and
pretty quick.
Now, if I try to assign that array to a session variable it chokes.
e.g. create array and load each element with a row from the file (btw,
each row is an array as well, using fgetcsv()). When local array is
loaded, I assign to session var as so:
$_SESSION['mydata'] = localArray;

What happens is the server will sit there and churn for a long time. CPU
goes to 99% use and memory use explodes on the apache thread. It will
keep churning a looong time, so long that I had to stop the server to
make it quit. This happens on my windows server as well as fedoracore4
server.

I've tried these variations all with the same results:
- store reference to array in session var (although since it's an array,
I think it makes no difference). e.g. $_SESSION['mydata'] =& myArray;

- read the file directly into a sesson var, instead of creating a local
array first. e.g. $_SESSION['mydata'][] = $row; (grabbing one row at a
time from file)

Same thing always happens.
Anybody have any insight into storing large arrays as session vars? Is
it bad practice? Can it be done? What's the scoop?

Any help appreciated!
Thanks
B
Feb 11 '06 #1
4 3936
MrBiggles wrote:
Here's the sitch:

I read in a csv file with 60000 lines (20 fields per record), and store
the data to a local array. The file is read in and stored just fine and
pretty quick.
Now, if I try to assign that array to a session variable it chokes.
e.g. create array and load each element with a row from the file (btw,
each row is an array as well, using fgetcsv()). When local array is
loaded, I assign to session var as so:
$_SESSION['mydata'] = localArray;

What happens is the server will sit there and churn for a long time. CPU
goes to 99% use and memory use explodes on the apache thread. It will
keep churning a looong time, so long that I had to stop the server to
make it quit. This happens on my windows server as well as fedoracore4
server.

I've tried these variations all with the same results:
- store reference to array in session var (although since it's an array,
I think it makes no difference). e.g. $_SESSION['mydata'] =& myArray;

- read the file directly into a sesson var, instead of creating a local
array first. e.g. $_SESSION['mydata'][] = $row; (grabbing one row at a
time from file)

Same thing always happens.
Anybody have any insight into storing large arrays as session vars? Is
it bad practice? Can it be done? What's the scoop?

Any help appreciated!
Thanks
B


Let's see... 60K records x 20 fields per record is 1.2M fields. That's
a lot of data. Then multiply by the average size of a field and you
have a lot of MB. I sure wouldn't try to store that much in a session!

Then PHP has to serialize the data to write it to the session file. And
unserialize when it reads the data in. A lot of work for that much data.

Doesn't look like a sound design to me... Maybe use a database instead?

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Feb 11 '06 #2
On 2006-02-11, MrBiggles <mr**********@yahoo.com> wrote:
I read in a csv file with 60000 lines (20 fields per record), and store
the data to a local array. The file is read in and stored just fine and
pretty quick.
Now, if I try to assign that array to a session variable it chokes.
e.g. create array and load each element with a row from the file (btw,
each row is an array as well, using fgetcsv()). When local array is
loaded, I assign to session var as so:
$_SESSION['mydata'] = localArray;
Here I'm limited to something like 3.2K much more than that and the session
data is lost.
What happens is the server will sit there and churn for a long time. CPU
goes to 99% use and memory use explodes on the apache thread. It will
keep churning a looong time, so long that I had to stop the server to
make it quit. This happens on my windows server as well as fedoracore4
server.


maybe you need more ram.

Bye.
Jasen
Feb 12 '06 #3
On 2006-02-12, Jasen Betts <ja***@free.net.nz> wrote:
On 2006-02-11, MrBiggles <mr**********@yahoo.com> wrote:
I read in a csv file with 60000 lines (20 fields per record), and store
the data to a local array. The file is read in and stored just fine and
pretty quick.
Now, if I try to assign that array to a session variable it chokes.
e.g. create array and load each element with a row from the file (btw,
each row is an array as well, using fgetcsv()). When local array is
loaded, I assign to session var as so:
$_SESSION['mydata'] = localArray;


Here I'm limited to something like 3.2K much more than that and the session
data is lost.


sorry, no that was a mozilla bug not displaying lines with that many
non-space characters... I've tested sessions upto 2M here - that's about the
limit for this old hardware...
hmm...

I hear (and see in my config file) that PHP gets (by default) 8M of ram
to play with.

60K x 20 is 1200K fields
there's only room for an about 8 bytes per field, four of which are
probably going to be a pointer of some sort there's probably another four
needed for memory allocation control, or a reference counte etc... looks
like you're doomed before you even start.

I did some testing:

$a=array();
for($c=200;$c<60000;$c+=200)
{
for($b=$c-200;$b<$c;$b++)
{
$a[$b]=array('1','2','3','4','5','6','7','8','9','0',
'a','b','c','d','e','f','g','h','i','j');
print('.');
}
print '<br>' .$c; flush();
};
I get about 5500 rows by 20 elements by 1 character each before I exceed
that limit

if you bump the limit up to say 400M you might have some success
(dependant on record sizes).

that means your server wants around 40G of ram to be able to handle 100
simultaneous requessts... (is 100 a reasonable figure??)

ISTM it might be time to re-evaluate the task and either do without the huge
array, or store and process it using some other language (like a databaee
using SQL or a custom app using C, or a combination oof the two)

Bye.
Jasen
Feb 12 '06 #4

"Jasen Betts" <ja***@free.net.nz> wrote in message
news:3f*****************@clunker.homenet...
On 2006-02-12, Jasen Betts <ja***@free.net.nz> wrote:
On 2006-02-11, MrBiggles <mr**********@yahoo.com> wrote:
I read in a csv file with 60000 lines (20 fields per record), and store
the data to a local array. The file is read in and stored just fine and
pretty quick.
Now, if I try to assign that array to a session variable it chokes.
e.g. create array and load each element with a row from the file (btw,
each row is an array as well, using fgetcsv()). When local array is
loaded, I assign to session var as so:
$_SESSION['mydata'] = localArray;
Here I'm limited to something like 3.2K much more than that and the
session
data is lost.


sorry, no that was a mozilla bug not displaying lines with that many
non-space characters... I've tested sessions upto 2M here - that's about
the
limit for this old hardware...
hmm...

I hear (and see in my config file) that PHP gets (by default) 8M of ram
to play with.

60K x 20 is 1200K fields
there's only room for an about 8 bytes per field, four of which are
probably going to be a pointer of some sort there's probably another four
needed for memory allocation control, or a reference counte etc... looks
like you're doomed before you even start.


struct {
union {
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
} value;
zend_uint refcount;
zend_uchar type;
zend_uchar is_ref;
} zval;
so the sizeof(double)+sizeof(unsigned int)+sizeof(unsigned
char)+sizeof(unsigned char)
I forgot my C!
I think it's 8+4+1+1.14 bytes to start with, + the sizeof(the HashTable)
when that's all done.
not much detail there. the details about the internal structure of a
hashtable weren't given. sorry. But I suspect this struct is only necessary
once, not repeated every array element, due to the refcount. a refcount is
only needed by the parser/interpreter for certain purposes (like language
"references" & mainly keeping track of pointer counts under the hood).

I did some testing:

$a=array();
for($c=200;$c<60000;$c+=200)
{
for($b=$c-200;$b<$c;$b++)
{
$a[$b]=array('1','2','3','4','5','6','7','8','9','0',
'a','b','c','d','e','f','g','h','i','j');
print('.');
}
print '<br>' .$c; flush();
};
I get about 5500 rows by 20 elements by 1 character each before I exceed
that limit

if you bump the limit up to say 400M you might have some success
(dependant on record sizes).

that means your server wants around 40G of ram to be able to handle 100
simultaneous requessts... (is 100 a reasonable figure??)

ISTM it might be time to re-evaluate the task and either do without the
huge
array, or store and process it using some other language (like a databaee
using SQL or a custom app using C, or a combination oof the two)

Bye.
Jasen

Feb 16 '06 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: DrewM | last post by:
I'm still thinking about session variables :-) Does anyone know the detail of how session variables are actually stored? The question I'm trying to answer is: Is it more efficient to store and...
11
by: Colin Steadman | last post by:
Hope this makes sense! I'm building an ASP page which allows uses to add items to an invoice via a form, ie: Item No Part No Order No Quanity Units Price VAT ------- ...
3
by: NCZIMM | last post by:
I am trying to create a session array then use the array in a foreach. I get an error saying: "foreach statement cannot operate on variables of type 'object' because 'object' does not contain a...
5
by: ASP.Confused | last post by:
As you can tell from my previous posts on this issue...I'm really confused :-/ I have a few ASP.NET web applications on my web host's "https" server. Our web host has a single "bin" folder for...
4
by: T Ralya | last post by:
I am told that ASP.NET controls the session ID and session variables, but that does not fit my symptoms. I am posting here as directed. I'm hoping that someone can at least recommend something to...
1
by: Gregory Hassett | last post by:
Hello, I am calling into a legacy COM server from VB.NET. The method that I am calling expects an array. Here is the example syntax provided by the author of this COM automation object -- this...
3
by: Brad | last post by:
I am storing an array which contains about a dozen chracter items to a Session variable. Later, I need to use this array so I am doing the following: Dim eventTypes As String() =...
6
by: divya | last post by:
I have a page name edit.asp which should expire immediately .The user cannot open this page directly he has to provide a password for entering this page.thus when the user enters edit.asp , it has...
1
by: None | last post by:
Hi, I have developed webshop application using asp.net 1.1. I'm using DataGrid in one of the pages of my site. During the page load the DataGrid will be binded by around 7500 products(rows). At...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.